-1

10 秒ごとにNSTimer実行され、LandingController.m から開始される があります。アプリケーションの他のビューに移動しても、引き続き実行されます。(そのタイマー内で特定の条件が満たされたときに) 別のビューからラベル フィールドを更新できるようにしたい GuardMenu.m 更新したいラベルは CurrentZone.text と呼ばれ、値 "N" から値「Y」。

これが LandingController.m のタイマーです。

self.messageTimer = [NSTimer scheduledTimerWithTimeInterval:10.0
                        target:self
                        selector:@selector(checkForMessages)                                                                     
                        userInfo:nil
                        repeats:YES];

これは LandingController.m でこれを呼び出します

- (void)checkForMessages
{

        if ( //some condition here ){

        //update CurrentZone.text label in GuardMenu view and set equal to "Y"

        } else {

        //no need to update label in GuardMenu as it's currently equal to "N"

        }


    }
4

7 に答える 7

8

init最初に GuardMenu クラスのメソッドでNSNotification を作成します

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:@"TextChangeNotification" object:nil];
    }
    return self;
}

次に、通知のセレクターを実装します。ここで、CurrentZoneラベル テキストを変更します。

- (void)receiveNotification:(NSNotification *) notification {
    if ([[notification name] isEqualToString:@"TextChangeNotification"]) {
        NSLog (@"Change you label here");
        self.lblCurrentZone.text = @"Y";
    }
}

今あなたのLandingViewController.m -viewDidLoad方法で

タイマーを開始します。

self->msgTimer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(checkForMessages) userInfo:nil repeats:YES]; 

@selector次に、NSTimerの を実装します。this is where you will be sending the notification back to the GuardMenu class

- (void)checkForMessages {
    NSString *strText = @"test";
    if ([strText isEqualToString:@"test"]){
        [[NSNotificationCenter defaultCenter] postNotificationName:@"TextChangeNotification" object:nil];
    }
    else {

    }
}

注:NotificationNameは同じである必要があります。

サンプル プロジェクト コード Dropbox リンク

于 2013-05-18T05:48:36.600 に答える
0

通知を利用できます。

GuardMenu クラスinitで、カスタム通知を登録します

[[NSNotificationCenter defaultCenter] addObserver:self 
                                      selector:@selector(receiveNotification:) 
                                      name:@"MessageChangeNotification" 
                                      object:nil];

LandingController->checkForMessages メソッドで、条件が満たされたときに通知を送信します。

[[NSNotificationCenter defaultCenter] postNotificationName:@"MessageChangeNotification" 
                                      object:nil];

GuardMenu クラスで、通知コールバック セレクターを実装します。

- (void) receiveNotification:(NSNotification *) notification
{

    if ([[notification name] isEqualToString:@"MessageChangeNotification"]) {
        NSLog (@"Successfully received the notification");
        //Change the label text here..
    }
}

それが役に立てば幸い!
アマール。

于 2013-05-14T11:05:55.810 に答える
0

発生しているエラーを説明する必要があるかもしれません。あなたのcheckForMessagesメソッドは発火していますか(発火していませんか)?NSLog()メッセージで確認してください。それ以外の場合は、UILabel変更したい が実際にメモリにロードされている (つまり、 でないnil) かどうかを確認します。がまたは別のビュー コントローラcurrentZone.textのビュー階層の一部であるかどうかもお知らせください。LandingController

于 2013-05-13T15:55:59.153 に答える
0

GuardMenu クラスの init で通知を作成する

[[NSNotificationCenter defaultCenter] addObserver:self 
                                  selector:@selector(receiveNotification:) 
                                  name:@"UpdateCurrentZoneNotification" 
                                  object:nil];

LandingController では、

  • (無効)checkForMessages {

    if ( //some condition here ){
    [[NSNotificationCenter defaultCenter] postNotificationName:@"UpdateCurrentZoneNotification" 
                                  object:nil];
    //update CurrentZone.text label in GuardMenu view and set equal to "Y"
    
    } else {
    
    //no need to update label in GuardMenu as it's currently equal to "N"
    
    }
    

    }

于 2013-05-15T13:31:08.517 に答える