【问题标题】:Handing off delegate via Segue - bad pattern?通过 Segue 移交代表 - 模式不好?
【发布时间】:2015-07-21 11:18:46
【问题描述】:

我有一些运行良好的 Obj-c 代码,但我想知道它是否使用了“反模式”,以及是否有明显更好的路线可供更有经验的人采用。

  • ViewController1 充当从第三方库实例化的对象的委托。它在前台。
  • ViewController2 即将进入前台。在 segue 中,在 prepareForSegue 中,ViewController1 将其当前作为委托的对象的委托设置为 ViewController2,以便在 ViewController2 处于前台时在 ViewController2 上接收任何后续委托调用。

这行得通。它并没有让我太困扰。但这感觉像是可能有更惯用的解决方案。

【问题讨论】:

    标签: ios objective-c iphone delegates


    【解决方案1】:

    我不知道它是否适合您的情况,但是,如何制作一个为您管理委托内容的超级视图控制器,并让您的 ViewController1 和 ViewController2 成为它的子类?我会给你一个使用伪代码的例子。

    你的 super_view_controller.m

    - (void)viewWillAppear:(BOOL)animated {
    
        [super viewWillAppear:animated];
    
        //your delegate stuff, supposing the 3rd party lib object is singleton
        [[3PARTYOBJ sharedInstance] setDelegate:self];
    }
    
    - (void)someDelegateMethod {
    
        //common stuff
    }
    

    此时,如果您的 view_controller1 和 view_controller2 继承自 super_view_controller 类,您无需担心更改委托所有者,它会自动发生...如果您需要在 view_controller1 或 2 上做单独的事情,只需覆盖委托方法:

    view_controller1.m(super_view_controller 子类)

    - (void)someDelegateMethod {
    
        //if you need common stuff, call super
        //[super someDelegateMethod];
    
        //or do your view_controller1 stuff here
    }
    

    (如果没有必要,您不需要覆盖view_controller2 上的委托方法。将调用super 方法)

    【讨论】:

      【解决方案2】:

      当您将 ViewController1 呈现/推送到 ViewController2 时,只需将对象的委托更改为 ViewController2。就像传递变量一样传递你的委托。

      例如: 如果您使用故事板转场

      - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender   
      {
          if ([segue.identifier isEqualToString:SEGUE_IDENTIFIER]) {
          ViewController2 *vc=(ViewController2 *)[segue destinationViewController];
          vc.OBJECT_IN_VIEWCONTROLLER1=OBJECT_IN_VIEWCONTROLLER2;
          vc.OBJECT_IN_VIEWCONTROLLER2.delegate=vc;
          }
      }
      

      同时在 ViewController2 中设置 Object 类及其委托方法

      【讨论】:

        猜你喜欢
        • 2023-03-10
        • 2013-09-20
        • 1970-01-01
        • 2014-05-10
        • 2019-04-25
        • 2018-06-28
        • 1970-01-01
        • 2019-07-29
        • 1970-01-01
        相关资源
        最近更新 更多