如何在每个应用程序视图的导航栏上添加带有动态内容的标签?

Posted

技术标签:

【中文标题】如何在每个应用程序视图的导航栏上添加带有动态内容的标签?【英文标题】:How can I add a label with dynamic content on the NavigationBar on every of my application's view? 【发布时间】:2013-02-04 16:02:18 【问题描述】:

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

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

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

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

【问题讨论】:

用这个标签作为属性创建一个SuperViewController,让你的9个视图继承自它? 每个导航栏必须有不同的消息,否则它们必须显示与您在应用程序委托中获取的完全相同的消息? @pmk 你能详细解释一下吗?这个标签我必须在栏上添加,但如果我写 [barButtonItem initWithCustomView: label]。它会显示每秒变化的动态内容吗? @SpaceDust 每个栏必须显示一个带有新消息计数器的标签(计数发生在 appDelegate 中)。 @HarryCater 您的问题有点令人困惑,需要更多解释,所以假设我在视图 5 中有一条新消息到达您的应用程序委托,然后会发生什么?计数器只是一个整数做什么? 【参考方案1】:

如果我对您的问题的理解正确,一个选项是Singleton Design Pattern,请查看here 了解详情。

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

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

下面的例子是 integer 将其更改为 string 或您想要的任何类型,

在你的 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 事件的干扰)你需要:

How update a label periodically on ios (every second)?

UILabel text not being updated

- (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;


【讨论】:

谢谢。这是一个很好的答案。很高兴你能理解我的问题。但是你能解释一下这些行吗: dispatch_once(&onceToken, ^ sharedInstance = [[SingletonClass alloc] init]; // 在这里做任何其他的初始化工作 );返回共享实例; 我们确保它只创建一次的方法是使用 Grand Central Dispatch (GCD) 中的 dispatch_once 方法。这是线程安全的,完全由操作系统为您处理,因此您完全不必担心。 // Do any other initialisation stuff here,只是一个评论,所以如果你想将安全线程更改为手动,你应该在那里做一些事情,这完全是一个新问题。【参考方案2】:

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

您的 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 并将其文本设置为您喜欢的任何内容。

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

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

希望对你有帮助!

【讨论】:

以上是关于如何在每个应用程序视图的导航栏上添加带有动态内容的标签?的主要内容,如果未能解决你的问题,请参考以下文章

导航栏上的 iOS::Button 仅出现在根视图控制器上

如何在每个视图上添加 UISearchbar

如何在导航栏上添加带有动画的广告? [关闭]

如何在导航栏上添加UIView?

如何在导航栏上为单个视图上的不同按钮设置标题?

如何删除和添加导航栏上的“返回按钮”