parentViewController始终是导航控制器吗?

bpa*_*apa 7 iphone cocoa-touch

一个星期前我对此感到有些不安,现在我的腰带上有一点点可可体验,我觉得我对可能发生的事情有所了解.

我正在创建一个由UINavigationController驱动的应用程序.在AppDelegate中,我使用"第1页"作为根视图控制器创建此类的实例.

UINavigationController *aNavigationController = [[UINavigationController alloc] 
     initWithRootViewController:page1ViewController];
Run Code Online (Sandbox Code Playgroud)

现在我在这里遇到问题.从"第1页"开始,我想使用在界面上滑动的模态视图控制器,然后在用户进行编辑后消失.我在Page1ViewController中使用这样的代码来做到这一点:

[self presentModalViewController:myModalViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

当模态视图控制器消失时,我希望"页面1"上的值根据用户在模态视图控制器中输入的内容进行更改.所以,我写了一些像这样的代码,它存在于模态视图控制器中:

[self.parentViewController dismissModalViewControllerAnimated:YES];
[self.parentViewController doSomethingPleaseWithSomeData:someData];
Run Code Online (Sandbox Code Playgroud)

第1页的更新没有发生,我花了很长时间才意识到"doSomethingPleaseWithSomeData"消息没有发送到Page1ViewController,而是发送到导航控制器.

使用导航控制器时总会出现这种情况吗?我是否可能配置不正确的东西?是否有一种简单的方法来获取我想要的View Controller(在本例中为Page1ViewController).

Ale*_*lex 14

我建议使用委托模式来解决您的问题.创建一个属性

@property (nonatomic, assign) id <MyModalViewDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

和相应的协议

@protocol MyModalViewDelegate
@optional
    - (void)myModalViewControllerDidFinish:(MyModalViewController *)aModalViewController;
@end
Run Code Online (Sandbox Code Playgroud)

当用户完成您的视图时(例如,点击保存按钮),发送此消息:

if ([self.delegate respondsToSelector:@selector(myModalViewControllerDidFinish:)])
    [self.delegate myModalViewControllerDidFinish:self];
Run Code Online (Sandbox Code Playgroud)

现在,将委托设置为应该管理整个事物的视图控制器,并在视图控制器完成时通知它.请注意,您需要视图控制器来关闭模态视图控制器.但是,从逻辑上讲,这是有道理的,因为它是首先呈现模态视图控制器的对象.

这就是Apple在例如UIImagePickerController和UIPersonPickerController中解决这个问题的方法.