我有一个UIViewController,它有一个UIPopoverController,它有一个UINavigationController,然后是一个UIViewController。我如何从子UIViewController中调用父UIViewController中的方法(例如 - (void)update)?尝试了很多组合,但仍然无效。
答案 0 :(得分:5)
在你的孩子身上:
@interface MyChildController:UIViewController {
MyParentController *parent;
}
@property(nonatomic, assign) MyParentController *parent;
@end
@implementation MyChildController
@synthesize parent;
...
在您的父控制器中,实例化您的孩子:
MyChildController *newChild = [[[MyChildController alloc] initWithNibName:nil bundle:nil] autorelease];
newChild.parent = self;
...
现在,在您的孩子中,您可以使用您父母的参考资料。例如,你孩子的一些方法:
- (IBAction)someAction {
[self.parent doSomethingParentsDo];
}
答案 1 :(得分:1)
一种可能的方法是使用NSNotificationCenter。在父ViewController的viewDidLoad:
方法中,将其注册为某个通知的观察者(我将在我的示例中使用@“DummyNotification”作为通知名称)。然后从子ViewController中的相应方法发布该通知。结果将如下所示:
ParentViewController.m
- (void) viewDidLoad
{
/* existing code */
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(update) name:@"DummyNotification" object:nil];
}
- (void) update
{
//method body
}
ChildViewController.m
//put this line wherever you want the ParentViewController to call -update
[[NSNotificationCenter defaultCenter] postNotificationName:@"DummyNotification" object:self];
参考:NSNotificationCenter Class Reference
此外,此问题被标记为iPhone,但Apple的UIPopoverController文档指出该类专门用于iPad,并且不能在其他设备上使用。这个问题标记错了吗?