我有一个iPad视图,它提供了一个模态表单,实际上是一个“设置”视图。 用户可以从那里进入特定设置。当模态视图被解除时,我需要能够刷新主iPad视图。
因此,当模态视图被解除时,我需要一个委托协议来调用-(void)refreshTable
。这不会是一个问题,除非我提出模态视图,我需要分配的委托,是一个从显示的视图“推”的视图。 (截图)
以下是我如何呈现模态表单:
我将它封装在UINavigationController中,因为它需要推送其他视图
(我只是在这里分配代理,但协议的视图从AddView推送)NewAftpViewController
是具有协议的视图控制器。
-(void)presentAddView:(id)sender {
AddView *avc = [self.storyboard instantiateViewControllerWithIdentifier:@"add"];
UINavigationController *navcont = [[UINavigationController alloc] initWithRootViewController:avc];
navcont.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentViewController:navcont animated:YES completion:NULL];
}
这是推送视图中的协议:
@protocol RefreshAfterAddingNewAftpDelegate
-(void)refreshTable;
@end
@interface NewAftpViewController : UIViewController
@property (nonatomic, retain) id <RefreshAfterAddingNewAftpDelegate> refreshAfterAddingNewAftpDelegate;
@end
答案 0 :(得分:2)
我可以看到两种方法。您应该能够使用[self.navigationController presentingViewController]
获得对帖子中最左侧控制器的引用 - 您需要将self.navigationController
转换为任何类。然后在NewAftpViewController
中,您可以像这样设置代理:
self.delegate = [(cast here)self.navigationController presentingViewController];
但这似乎打败了使用委托的目的 - 委托人不应该知道委托是什么类,但在这里你必须明确地设置它。您可以直接在该控制器上调用方法,而不是使用委托。
我认为在这种情况下更好的方法是使用NSNotification
。这对我来说似乎更清洁,更简单。只需发布NewAftpViewController
的通知,让第一个控制器听取它。
答案 1 :(得分:1)
在推送下一个View Controller的prepareForSeague
方法中,您可以设置委托:
CustomController *controllerToPush = segue.destinationViewController;
controllerToPush.delegate = self.navigationController.parentViewController;
希望这有帮助!