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)
但这不起作用..
有什么建议?
问题是因为self.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)
| 归档时间: |
|
| 查看次数: |
943 次 |
| 最近记录: |