0

私はこのような問題を抱えています: バックグラウンドスレッドで私のアプリケーションはサーバー上で毎秒新しいユーザーメッセージを探しており、新しい着信メッセージがある場合、アプリはそれについてユーザーに通知します。(アプリ デリゲートに実装したメッセージ ルックアップのこのロジック)。アプリにはそれぞれナビゲーション バーを備えた 9 つのビューがあり、このナビゲーション バーに新しいメッセージ カウンターを含むラベルを表示したい (整数カウンターのみ)新しい未読メッセージ)。ラベルを作成してアプリデリゲートに接続する方法がわからない問題。ここに私が欲しいもののイメージがあります: ここに画像の説明を入力

ラベルには、ユーザーへの 13 件の新しいメッセージがあります。このボタンは、アプリの 9 つのビューすべてに配置する必要があります。

最初に私の考えは、AppDelegate ファイルで UILabel を作成し、次に customView で UIBarButtonItem を作成することでした。しかし、アプリケーションの各ビューのナビゲーション バーにこのボタンを追加するにはどうすればよいでしょうか? (ナビゲーションバーには他のボタンもあります)

この質問は少しあいまいかもしれませんが、専門家がそれを理解してくれることを願っています.私は本当にこれについて助けが必要です.

4

2 に答える 2

2

私があなたの質問を正しく理解していれば、詳細についてSingleton Design Patternこちらをご覧ください。

したがって、シングルトンを使用すると、グローバル インスタンスを設定し、必要なときに呼び出すことができます。

コードを右クリックして、SingletonClass という名前の Objective-c クラスを追加し、NSObject のサブクラスにします。

以下の例は、必要に応じinteger て astringまたは任意のタイプに変更します。

あなたのSingletonClass.hであなたの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 つのビュー (ViewController であることを願っています) が新しいクラスから継承されますMySuperViewController

#import "MySuperViewController.h"
@class MySuperViewController;

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

AppDelegate から、各 yourViewControllers headerLabel にアクセスし、そのテキストを好きなように設定できるようになりました。

このコードはテストされていないため、誤りがある可能性があることに注意してください。

編集:私はあなたの更新を写真で見ました。もちろん、ボタンで同じことを行うことができます。

それが役に立てば幸い!

于 2013-02-04T16:33:20.857 に答える