2016-04-08 2 views
0

私のプロジェクトの非活動的な実装です。私はプロジェクトのRootViewControllerクラスでNSNotificationを作成しました。目的地cでのセッションの非アクティブ化のためのnsnotificationアプローチ

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle: @"Close" 
                      style: UIBarButtonItemStyleDone 
                      target: self 
                      action: @selector(closeModal)]; 

    UIImage *image = [UIImage imageNamed:@"fidelity_logotype"]; 
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, image.size.width, image.size.height)]; 
    [imageView setImage:image]; 
    [self.navigationItem setTitleView:imageView]; 
    self.navigationController.view.backgroundColor = [UIColor fidelityGreen]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidTimeout:) name:@"ApplicationTimeout" object:nil]; 
} 


- (void) applicationDidTimeout:(NSNotification *) notif 
{ 
    NSLog(@"I m here"); 


    BCDSessionInactivityViewController *sessionView=[[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"InactivityViewController"]; 

    sessionView.modalPresentationStyle = UIModalPresentationFormSheet; 
    sessionView.preferredContentSize = CGSizeMake(838,340); 

    [[self topViewController] presentViewController:sessionView animated:YES completion:nil]; 

} 

とlogoutviewcontrollerで、私は

 - (IBAction)logoutbtn:(id)sender 
     { 
      NSLog(@"logout is called"); 
      [sessionTimer invalidate]; 


sessionTimer = nil; 
     [[BCDTimeManager sharedTimerInstance]stopIdleTimer]; 
     //[self dismissViewControllerAnimated:YES completion:nil]; 

     [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ApplicationTimeout" object:nil]; 


     [self performSegueWithIdentifier:@"Thankyoupage" sender:self]; 


    } 

これは私が通知を掲示コードで下に書かれたこのオブザーバを削除しています。初めてのログインのための

- (void)idleTimerExceeded { 
    NSLog(@"idle time exceeded"); 
    [[NSNotificationCenter defaultCenter] 
    postNotificationName:@"ApplicationTimeout" object:nil]; 
} 

は、それがタイマーを超えたときに、私は通知し、モデルビューを投稿完璧presesntedされますが、ユーザーがログアウトすると、その通知が掲載されるたびに、セレクタメソッドの後に二回呼ばなっている正常に動作します

通知が1回だけ投稿されていることは間違いありません。

すべてのビューコントローラで通知を作成し、ビューのアンロード時に削除する必要がありますか?

私はここで間違っていますか?

+0

を除去するためのremoveObserverを呼び出すあなたはOK通知オブザーバを追加しましたが、あなたは通知をポストどこ私は見ていませんよ。通知ポストは一度だけ呼び出されていますか?一度しか呼ばれていないことを確認するためにそこにログを記録しましたか? – fsb

+0

@fbara通知を掲示しているコードを追加しました。通知は一度だけ通知されていますが、メソッドは2回呼び出されていることは確かです – Nitya

+0

もちろん、すべてのVCで新しい通知を作成する必要はありませんでした。コード内のある場所からのみ 'idleTimerExceeded'を呼び出していますか? – fsb

答えて

0

RootViewControllerに通知を追加し、LogoutViewControllerから削除しようとしています。したがって、RootViewControllerに追加された通知オブザーバは決して削除されません。だからあなたがログアウトしてログインするたびに、オブザーバーの呼び出しは1つ増えます。問題を修正するには、オブザーバをRootViewControllerオブジェクトから削除する必要があります。あなたがあなたのコメントで述べた問題を修正するために

私がRootViewControllerでオブザーバを削除すると、タイマー場合 は、いくつかの他のビューに超えており、通知オブザーバが呼び出されません。我々は唯一のrootviewController

  • はオブザーバを追加するためのAppDelegate
    • Oneの2つのパブリックメソッドを書く達した後に発生するタイマー 通知(addObserverをしたいので また、私は、アプリのデリゲートにオブザーバを追加することはできません。あなたが到達したときの観察者(removeObserver)
  • を除去するため)
  • ワンログアウトを押すとRootViewControllerは、オブザーバー
  • を追加するためのaddObserverメソッドを呼び出して、オブザーバー
+0

こんにちはミッドン、私はあなたが他の誰かの投稿で応答を見た。 RootViewControllerでオブザーバを削除すると、他のビューでタイマーが超過した場合、通知オブザーバが呼び出されません。また、私は私たちがrootviewControllerに達するとタイマー通知を発生させたいので、私はアプリケーションデリゲートにオブザーバーを追加できません – Nitya

+0

私はあなたの助けをここで楽しみにしています。私はこんなにここにこだわっています。 – Nitya

+0

@ニッタ:更新された回答を確認してください –

関連する問題