1

我有一個UINavigationGroup與根視圖控制器MainViewController。這裏面MainViewController我打電話另一個UINavigationController爲模式如下:從模態或推送視圖調用父方法presentationViewController

- (IBAction)didTapButton:(id)sender { 
    UINavigationController * someViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"someNavigationController"]; 
    [self.navigationController presentViewController:someViewController animated:YES completion:nil]; 
} 

這裏面someNavigationController,用戶正在經歷某些過程使導航控制器正在與一些UIViewControllers推。用戶完成過程後,在最後UIViewController稱爲finalStepViewController,我關閉模式如下:

[self dismissViewControllerAnimated:YES completion:nil];

模態確實駁回,用戶回到初始MainViewController。 但是,我想推另一個UIViewControllerMainViewController的NavigationController(例如:一個視圖,說用戶已成功完成該過程)。最好在模態被解除之前。

我曾嘗試以下的事情:

1.使用presentingViewController

UIViewController * successViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"successViewController"]; 
[self.presentingViewController.navigationController successViewController animated:YES]; 

結果:沒有錯誤,但沒有發生任何。

2.代表/協議

  • 進口finalStepViewController.h內部MainViewController.h和所附<finalStepViewControllerDelegate>
  • 內部MainViewController.m添加了一個名爲parentMethodThatChildCanCall被調用方法從finalStepViewController.m
  • 添加以下到finalStepViewController.h

    @protocol finalStepViewControllerDelegate <NSObject> -(void)parentMethodThatChildCanCall; @end @property (assign) id <finalStepViewControllerDelegate> delegate;@synthesize delegate;模型

  • 在上面的委託屬性設置爲someViewController提到didTapButton IBAction爲自我。這表明通知錯誤說:
  • 最後在關閉模式之前調用[self.delegate parentMethodThatChildCanCall]

結果:除通知錯誤外,沒有失敗但沒有任何反應,因爲parentMethodThatChildCanCall未被調用。

任何想法我做錯了/我應該做什麼?這是我的第二週做Objective-C,大部分時間我不知道我在做什麼,所以任何幫助/代碼將不勝感激!

謝謝。

回答

1

使用NSNotificationCenter您可以輕鬆實現這一點。

在你MainViewController-viewDidLoad添加以下代碼

typeof(self) __weak wself = self; 
    [[NSNotificationCenter defaultCenter] addObserverForName:@"successfullActionName" 
                object:nil 
                queue:[NSOperationQueue mainQueue] 
               usingBlock:^(NSNotification *note) { 
                SuccessViewController *viewController; // instantiate it properly 
                [wself.navigationController pushViewController:viewController animated:NO]; 
               }]; 

在dealloc的

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

FinalStepViewController上駁回了視圖控制器之前駁回後通知操作取下NSNotificationCenter控制器

- (IBAction)buttonTapped:(id)sender { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"successfullActionName" object:nil]; 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

這個例子很粗糙,不太理想,你應該爲你的通知名稱使用常量,並且在某些情況下存儲由NSNotificationCenter返回的觀察者以刪除特定的。

- 編輯 我想也提到,該方法addObserverForName:object:queue:usingBlock:實際上返回觀察者作爲id類型的對象。您需要在您的課堂中將其作爲iVar的引用進行存儲,並在dealloc方法被調用時將其從NSNotificationCenter中刪除,否則觀察者將永遠不會被釋放。

+0

這工作,感謝您的快速答案。你能否詳細說明/提供你最後的評論? – dandoen

+1

您應該創建具有自解釋名稱的靜態常量,並將它們用於notificationName而不是NSStrings。作爲一個例子,你可能已經創建了一個常量'static NSString * const MYSuccessfullActionNotification = @「MYSuccessfullActionNotification」;'並將常量值傳遞給'[[NSNotificationCenter defaultCenter] postNotificationName:MYSuccessfullActionNotification object:nil];'。常量基本上可以讓你免於錯別字。 – Eugene

相關問題