从子控制器调用父控制器的方法

3

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

MainController = (WatchedViewTableViewController*)self.parentViewController.childViewControllers[1];

一开始它运行得很好,但由于我的应用程序也允许其他选项卡访问此视图控制器,因此当从其他选项卡到达此视图控制器的某个层次结构时,它会导致索引错误的 MainController

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

应该采取什么正确的方法来实现它?谢谢。


你应该使用委托。 - E-Riddie
4个回答

4

ParentViewController.h文件中

-(void)PlayMusic;

ParentViewController.m文件中:
-(IBAction)PlayMusic:(id)sender {
       [self playMusic];
}

在子视图控制器上的播放按钮的IBAction中执行以下操作:
-(IBAction)PlayMusic:(id)sender {
       ParentViewController *parent = (ParentViewController*) self.parentViewController;
       [parent playMusic];
}

2
听起来你需要委托 以下是一些链接: 一般的想法是,你定义一个协议。然后,在父控制器中实现该协议。接下来,在子控制器中有一个该协议的实例引用父控制器:
    @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?

然后让您的父控制器实现它:

    @interface ParentViewController:UIViewController<CustomMethodDelegate>
    @end

    //  Converted to Swift 5.1
   class ParentViewController: UIViewController, CustomMethodDelegate {
   }

在您的父控制器中实现doSomething函数: 当您将其设置为子视图控制器时,请将子视图控制器的委托设置为父控制器。
@implementation ParentViewController
    -(void)creatingChildViewController {
        ChildViewController *controller = [self getNewChildViewController];
        controller.delegate = self;
    }

#pragma mark - CustomMethodDelegate

    -(void)doSomething {
        NSLog(@"Something");
    }

@end

//  Converted to Swift 5.1
  @objc func openChildViewController() {
    guard let childViewCtrl = UIStoryboard(name: "YourMainStoryboard", 
    bundle: nil).instantiateViewController(withIdentifier: 
    "YourIdentifier") as? ChildViewController else { return }
    childViewCtrl.delegate = self
    self.present(childViewCtrl, animated: false, completion: nil)
}

// MARK: - CustomMethodDelegate

  func doSomething() {
    print("Something")
  }

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

[self.delegate doSomething];

 //  Converted to Swift 5.1
 delegate.doSomething()

这将调用您的父控制器中的doSomething方法。


0
非常简单,只需使用关键字super和方法名称即可。默认示例包括:
[super viewDidDisappear:YES];

[super viewDidLoad];

这是如何从子类调用父类方法的方式。

0

这取决于您的使用情况,但子控制器可能不应直接调用父控制器的方法。看起来,您的子控制器应该定义一个协议,任何可能的父控制器都可以实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接