在iPad中为模板显示的表单分配代表

时间:2012-12-16 18:39:17

标签: ios xcode uiviewcontroller delegates

我有一个iPad视图,它提供了一个模态表单,实际上是一个“设置”视图。 用户可以从那里进入特定设置。当模态视图被解除时,我需要能够刷新主iPad视图。

因此,当模态视图被解除时,我需要一个委托协议来调用-(void)refreshTable。这不会是一个问题,除非我提出模态视图,我需要分配的委托,是一个从显示的视图“推”的视图。 (截图)

enter image description here

以下是我如何呈现模态表单: 我将它封装在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

2 个答案:

答案 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;

希望这有帮助!