我有一个带有包含子控制器B的容器的主控制器A,我需要从控制器B调用控制器A中的方法,这就是我从B获取父控制器所做的工作:
MainController = (WatchedViewTableViewController*)self.parentViewController.childViewControllers[1];
它在开始时工作正常,但由于我的应用程序允许其他选项卡也可以访问此视图控制器,当它从其他选项卡到达此视图控制器的某个层次结构时,会导致错误的MainController
索引。 / p>
由于该应用允许其他标签也重定向到此视图控制器,因此self.tabBarController.selectedViewController
也不起作用。
实现它的正确方法应该是什么?感谢。
答案 0 :(得分:4)
ParentViewController.h
-(void)PlayMusic;
ParentViewController.m
-(IBAction)PlayMusic:(id)sender {
[self playMusic];
}
在子视图控制器上的Play按钮的IBAction
处执行以下操作:
-(IBAction)PlayMusic:(id)sender {
ParentViewController *parent = (ParentViewController*) self.parentViewController;
[parent playMusic];
}
答案 1 :(得分:0)
这取决于您的用例,但子控制器可能不应该直接调用父控制器上的方法。看起来你的子控制器可能应该定义一个任何可能的父控制器都可以实现的协议。
答案 2 :(得分:0)
听起来你需要代表团 以下是一些链接:
一般的想法是你定义一个协议。然后,在父控制器中实现该协议。然后,您的子控制器中有一个引用父控制器的协议实例:
@protocol CustomMethodDelegate
-(void)doSomething
@end
让您的子控制器包含对父视图控制器的该协议的引用:
@interface ChildViewController:UIViewController
@property (strong, nonatomic) id<CustomMethodDelegate> delegate;
@end
然后让您的父控制器实现它:
@interface ParentViewController:UIViewController<CustomMethodDelegate>
@end
在父控制器中实现doSomething: 将其设置为子视图控制器时,将子代理设置为父控制器
@implementation ParentViewController
-(void)creatingChildViewController {
ChildViewController *controller = [self getNewChildViewController];
controller.delegate = self;
}
#pragma mark - CustomMethodDelegate
-(void)doSomething {
NSLog(@"Something");
}
@end
然后在您的子视图控制器中,您可以调用:
[self.delegate doSomething];
这将调用父控制器中的doSomething方法。
答案 3 :(得分:0)
使用关键字super然后使用方法名称非常简单
是默认示例
[super viewDidDisappear:YES];
[super viewDidLoad];
这是你从子类
调用父方法的方法