Ios 调用父控制器';来自子控制器的方法

Ios 调用父控制器';来自子控制器的方法,ios,uiviewcontroller,containers,Ios,Uiviewcontroller,Containers,我有一个主控制器a和一个包含子控制器B的容器,我需要从控制器B调用控制器a中的一个方法,这就是我从控制器B获取父控制器所做的: MainController = (WatchedViewTableViewController*)self.parentViewController.childViewControllers[1]; 它在开始时工作正常,但由于我的应用程序允许其他选项卡也访问此视图控制器,当它从其他选项卡到达此视图控制器的特定层次结构时,它会导致索引错误的MainController

我有一个主控制器a和一个包含子控制器B的容器,我需要从控制器B调用控制器a中的一个方法,这就是我从控制器B获取父控制器所做的:

MainController = (WatchedViewTableViewController*)self.parentViewController.childViewControllers[1];
它在开始时工作正常,但由于我的应用程序允许其他选项卡也访问此视图控制器,当它从其他选项卡到达此视图控制器的特定层次结构时,它会导致索引错误的
MainController

由于应用程序还允许其他选项卡重定向到此视图控制器,
self.tabBarController.selectedViewController
也无法工作


正确的方法应该是什么?谢谢。

这取决于您的用例,但是子控制器可能不应该直接调用父控制器上的方法。似乎您的子控制器应该定义一个任何可能的父控制器都可以实现的协议。

听起来您需要授权 以下是一些链接:

一般的想法是定义一个协议。然后,在父控制器中实现该协议。然后,在引用父控制器的子控制器中有该协议的实例:

    @protocol CustomMethodDelegate 
       -(void)doSomething
    @end

   //  Converted to Swift 5.1
   protocol CustomMethodDelegate: AnyObject {
    func doSomething()
   }
@interface ChildViewController:UIViewController 
    @property (strong, nonatomic) id<CustomMethodDelegate> delegate;
@end


//  Converted to Swift 5.1
class ChildViewController: UIViewController {
var delegate: CustomMethodDelegate?
让您的子控制器包含该协议对父视图控制器的引用:

    @protocol CustomMethodDelegate 
       -(void)doSomething
    @end

   //  Converted to Swift 5.1
   protocol CustomMethodDelegate: AnyObject {
    func doSomething()
   }
@interface ChildViewController:UIViewController 
    @property (strong, nonatomic) id<CustomMethodDelegate> delegate;
@end


//  Converted to Swift 5.1
class ChildViewController: UIViewController {
var delegate: CustomMethodDelegate?
}

然后在子视图控制器中,可以调用:

[self.delegate doSomething];

 //  Converted to Swift 5.1
 delegate.doSomething()
这将调用父控制器中的doSomething方法

使用关键字super和方法名非常简单 默认示例为

这就是从子类调用父方法的方式


ParentViewController.h

-(void)PlayMusic;

ParentViewController.m

-(IBAction)PlayMusic:(id)sender {
       [self playMusic];
}
在子视图控制器上播放按钮的
iAction
处执行以下操作:

-(IBAction)PlayMusic:(id)sender {
       ParentViewController *parent = (ParentViewController*) self.parentViewController;
       [parent playMusic];
}

你应该与代表一起工作
-(IBAction)PlayMusic:(id)sender {
       ParentViewController *parent = (ParentViewController*) self.parentViewController;
       [parent playMusic];
}