一个星期前我对此感到有些不安,现在我的腰带上有一点点可可体验,我觉得我对可能发生的事情有所了解.
我正在创建一个由UINavigationController驱动的应用程序.在AppDelegate中,我使用"第1页"作为根视图控制器创建此类的实例.
UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:page1ViewController];
现在我在这里遇到问题.从"第1页"开始,我想使用在界面上滑动的模态视图控制器,然后在用户进行编辑后消失.我在Page1ViewController中使用这样的代码来做到这一点:
[self presentModalViewController:myModalViewController animated:YES];
当模态视图控制器消失时,我希望"页面1"上的值根据用户在模态视图控制器中输入的内容进行更改.所以,我写了一些像这样的代码,它存在于模态视图控制器中:
[self.parentViewController dismissModalViewControllerAnimated:YES]; [self.parentViewController doSomethingPleaseWithSomeData:someData];
第1页的更新没有发生,我花了很长时间才意识到"doSomethingPleaseWithSomeData"消息没有发送到Page1ViewController,而是发送到导航控制器.
使用导航控制器时总会出现这种情况吗?我是否可能配置不正确的东西?是否有一种简单的方法来获取我想要的View Controller(在本例中为Page1ViewController).
我建议使用委托模式来解决您的问题.创建一个属性
@property (nonatomic, assign) iddelegate;
和相应的协议
@protocol MyModalViewDelegate @optional - (void)myModalViewControllerDidFinish:(MyModalViewController *)aModalViewController; @end
当用户完成您的视图时(例如,点击保存按钮),发送此消息:
if ([self.delegate respondsToSelector:@selector(myModalViewControllerDidFinish:)]) [self.delegate myModalViewControllerDidFinish:self];
现在,将委托设置为应该管理整个事物的视图控制器,并在视图控制器完成时通知它.请注意,您需要视图控制器来关闭模态视图控制器.但是,从逻辑上讲,这是有道理的,因为它是首先呈现模态视图控制器的对象.
这就是Apple在例如UIImagePickerController和UIPersonPickerController中解决这个问题的方法.