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

Cri*_*ter 0 iphone objective-c uiviewcontroller ipad modalviewcontroller

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

我认为从modalView我可以做类似的事情

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

但这不起作用..

有什么建议?

Ken*_*and 5

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

1)首先,您需要将self.parentViewController转换为父视图控制器的类型.就像是:

MyParentViewController *parentVC = (MyParentViewController*)self.parentViewController;
[parentVC loadInitialData];
Run Code Online (Sandbox Code Playgroud)

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

@interface MyModalViewController : UIViewController {
    MyParentViewController *myParentViewController;
}

@property (nonatomic, retain) MyParentViewController *myParentViewController;
Run Code Online (Sandbox Code Playgroud)

然后你可以打电话:

[self.myParentViewController loadInitialData];
Run Code Online (Sandbox Code Playgroud)

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

@protocol ManageDataDelegate

- (void) loadInitialData;

@end


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


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

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

当您呈现模态视图控制器时,只需设置委托.在MyParentViewController中:

MyModalViewController *vc = [[MyModalViewController alloc] init];
vc.delegate = self;
[self presentModalViewController:vc];
Run Code Online (Sandbox Code Playgroud)

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

[self.delegate loadInitialData];
Run Code Online (Sandbox Code Playgroud)