从开启视图上的ModalView调用方法

时间:2011-01-17 19:25:36

标签: iphone objective-c ipad uiviewcontroller modalviewcontroller

基本上我有一个在app启动时加载的viewController。在那个VC中,根据是否有userdata,我使用登录来提供ModalView。在用户登录后,我可以解除modalView,但是我想在开启器上调用一个方法,然后用数据填充表。

我从modalView中想到我可以做类似

的事情
[self.parentViewController loadInitialData];
[self.dismissModalViewControllerAnimated:YES];

但这不起作用..

有什么建议吗?

1 个答案:

答案 0 :(得分:5)

问题是因为s​​elf.parentViewController的类型为“UIViewController”,并且UIViewController中不存在-loadInitialData方法。有几种常见的方法可以解决这个问题......从最简单,最不“正确”到最复杂,最“正确”:

1)首先,您需要将self.parentViewController转换为父视图控制器的类型。类似的东西:

MyParentViewController *parentVC = (MyParentViewController*)self.parentViewController;
[parentVC loadInitialData];

2)您可以向模态视图控制器添加一个属性,该属性显式保持对父视图控制器的引用,然后调用loadInitialData来执行该操作。

@interface MyModalViewController : UIViewController {
    MyParentViewController *myParentViewController;
}

@property (nonatomic, retain) MyParentViewController *myParentViewController;

然后你可以打电话:

[self.myParentViewController loadInitialData];

3)最复杂但最正确的方法是创建一个Delegate协议,让你的ParentViewController实现协议,让你的模态视图控制器保持对委托的引用并以这种方式调用。类似的东西:

@protocol ManageDataDelegate

- (void) loadInitialData;

@end


@interface MyParentViewController : UIViewController <ManageDataDelegate> { ...


@interface MyModalViewController : UIViewController {
    id<ManageDataDelegate> delegate;
}

@property (nonatomic, assign) id<ManageDataDelegate> delegate;

当您展示模态视图控制器时,只需设置委托。在MyParentViewController中:

MyModalViewController *vc = [[MyModalViewController alloc] init];
vc.delegate = self;
[self presentModalViewController:vc];

然后在您的模态视图控制器中,您可以像这样回调:

[self.delegate loadInitialData];