0

我有这样一个问题:我在后台线程中的应用程序每秒都在服务器上寻找新的用户消息,如果有新的传入消息 - 应用程序会通知用户。(我在应用程序委托中实现的消息查找逻辑)。我在应用程序中有 9 个视图,每个视图都有一个导航栏,我想在这个导航栏上显示一个带有新消息计数器的标签(只是一个整数计数器新的未读消息)。问题我不知道如何创建标签并将其与应用程序委托连接。这是我想要的图像: 在此处输入图像描述

在标签中有 13 条新消息给用户。这个按钮必须在所有 9 个应用程序的视图上。

首先我的想法是在 AppDelegate 文件中创建一个 UILabel,然后使用 customView 创建 UIBarButtonItem。但是如何在我的应用程序中每个视图的导航栏上添加这个按钮呢?(我在导航栏上还有其他按钮)

可能这个问题有点模糊,但我希望专家能理解它。我真的需要帮助。

4

2 回答 2

2

如果我对您的问题的理解正确,一个选项是Singleton Design Pattern这里查看详细信息。

因此,使用单例,您将设置一个全局实例,然后在需要时调用它。

右键单击您的代码并添加一个 Objective-c 类名称为 SingletonClass,使其成为 NSObject 的子类

下面的示例是integer 根据需要将其更改为 astring或任何类型,

在你的 SingletonClass.h n 你的 SingletonClass.h

#import <Foundation/Foundation.h>

@interface SingletonClass : NSObject

@property int thisIsCounter;

+ (SingletonClass *)sharedInstance;

@end

在你的 SingletonClass.m

#import "SingletonClass.h"


@implementation SingletonClass

@synthesize thisIsCounter=_thisIsCounter;

+ (SingletonClass *)sharedInstance
{
    static SingletonClass *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[SingletonClass alloc] init];
        // Do any other initialisation stuff here
    });
    return sharedInstance;
}

- (id)init {
    if (self = [super init]) {

        // set a singleton managed object , variable in your case
        _thisIsCounter=self.thisIsCounter;

    }
    return self;
}

@end

并在你的情况下将你的单例类导入你想要的类中它的所有类

#import "SingletonClass.h"
//in your app delegate when you fetch data increase singleton variable or decrease it if you want , basically you have a global variable that you can use in your all classes
-(IBAction)plus 
{

    SingletonClass *sharedInstance = [SingletonClass sharedInstance];
    sharedInstance.thisIsCounter =sharedInstance.thisIsCounter + 1;
}

代码未经测试,根据需要对其进行改进。

//现在看着我!!!!!

上面将设置您的全局实例,现在每秒在您的视图控制器中调用它(这很棘手,因为您可能需要使用主线程并且它会受到 UI 事件的干扰)您需要:

如何在 iOS 上定期更新标签(每秒)?

UILabel 文本未更新

- (void)viewDidLoad
{
    [super viewDidLoad];
NSTimer* timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(updateLabel) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}
-(void) updateLabel
{
   SingletonClass *sharedInstance = [SingletonClass sharedInstance];
   self.button.text= sharedInstance.thisIsCounter;

}
于 2013-02-04T16:37:11.387 回答
0

如果我错了,请纠正我,但我是这样理解的:

您的 AppDelegate 管理 9 个 ViewController。每个都有自己的 NavigationBar。您希望每个 NavBar 都有一个带有不同文本的 UILabel,文本来自您的 AppDelegate。

我实现这一点的想法是从 UIViewController 创建一个新的子类,我们将其命名为MySuperViewController:标题:

@interface MySuperViewController : UIViewController{
    UILabel *headerLabel;
}
@property(nonatomic, retain)UILabel *headerLabel;
@end

执行:

@implementation MySuperViewController
@synthesize headerLabel;


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame, 44)];
        headerLabel.backgroundColor = [UIColor clearColor];
        headerLabel.numberOfLines = 2;
        headerLabel.font = [UIFont boldSystemFontOfSize: 14.0f];
        headerLabel.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
        headerLabel.textAlignment = UITextAlignmentCenter;
        headerLabel.textColor = [UIColor whiteColor];
        headerLabel.text = @"whatever";
        self.navigationItem.titleView = label;
    }
return self;
}
@end

现在你让你的 9 个视图(我希望你是 ViewControllers)从你的新类继承MySuperViewController

#import "MySuperViewController.h"
@class MySuperViewController;

@interface YourView1 : MySuperViewController{ } 等等...

您现在可以从您的 AppDelegate 访问您的每个 ViewControllers headerLabel 并将其文本设置为您喜欢的任何内容。

请注意,此代码未经测试,因此可能存在错误。

编辑:我刚刚看到你对图片的更新,当然你可以用你的按钮做同样的事情。

希望能帮助到你!

于 2013-02-04T16:33:20.857 回答