【问题标题】:Call a method from a ModalView that is on the opener view从打开视图上的 ModalView 调用方法
【发布时间】:2011-01-17 19:25:35
【问题描述】:

基本上我有一个在应用启动时加载的 viewController。在那个 VC 中,根据是否有用户数据,我提供了一个带有登录名的 ModalView。用户登录后,我可以关闭 modalView,但我想在打开器上调用一个方法,然后用数据填充表格。

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

[self.parentViewController loadInitialData];
[self.dismissModalViewControllerAnimated:YES];

但这不起作用..

有什么建议吗?

【问题讨论】:

  • 这个 loadInitialData: 方法是你的吗?如果正确实施,这应该没有任何问题..什么不起作用?你试过什么?我们需要更多信息来提供帮助。

标签: iphone objective-c ipad uiviewcontroller modalviewcontroller


【解决方案1】:

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

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) 最复杂但最正确的方法是创建一个委托协议,让您的 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];

【讨论】:

  • 使用委托是解耦类依赖的最佳策略。从您的 iTunes U 中查看斯坦福大学最近在 iOS 上提供的讲座之一。
  • 谢谢。这为我整理好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 2021-11-18
  • 1970-01-01
相关资源
最近更新 更多