【问题标题】:Calling parent controller's method from a child controller从子控制器调用父控制器的方法
【发布时间】:2014-05-25 03:22:30
【问题描述】:

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

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

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

由于该应用也允许其他标签页重定向到此视图控制器,self.tabBarController.selectedViewController 也不起作用。

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

【问题讨论】:

  • 你应该和代表一起工作

标签: ios uiviewcontroller containers


【解决方案1】:

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 方法。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        很简单,使用关键字 super 然后方法名 默认示例是

        [super viewDidDisappear:YES];
        
        [super viewDidLoad];
        

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

        【讨论】:

          猜你喜欢
          • 2017-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-05
          相关资源
          最近更新 更多