1

这个控制器有一个子控制器,它用很少的方法实现了一个委托协议。

ParentController : UIViewController <ChildControllerDelegate>

Parent 控制器有一个从自身内部调用的方法(让我们调用它doSomething)。

现在,我需要doSomething从子控制器内的按钮调用此方法。所以我可以想到3个选项:

  1. 在协议中添加一个方法pleaseCallDoSomething并从按钮调用该方法,然后pleaseCallDoSomething在父视图控制器中实现该方法,最后doSomethingpleaseCallDoSomething.
  2. 第二个选项是不在子视图协议中注册新方法,而是简单地使用:

    [btn addTarget:self.delegate action:@selector(doSomething) forControlEvents:UIControlEventTouchUpInside];
    
  3. 在协议中添加一个doSomething方法并在父视图控制器上实现它,然后在父视图控制器内部在需要时在本地调用它。(我的意思是从委托和本地调用委托方法)。

最佳实践是什么?

谢谢沙妮

4

2 回答 2

1

您不应该将您的委托绑定为按钮的目标。您的委托属性很可能被声明为弱以避免保留周期。如果您将其指定为目标,您将获得一个保留周期,并且只要您不删除该按钮,您的整个对象层次结构将永远不会被释放。

父<--强-->子<--弱-->父

父<--strong-->按钮

目标分配后

父<--strong-->子<--strong-->按钮<--strong-->父

此外,您的按钮不应该对控制器层次结构一无所知,因此我认为让您的视图与它们所来源的控制器以外的其他对象进行通信是不好的 MVC。这总是迟早会惹上麻烦的。

于 2012-05-10T05:15:07.710 回答
0

直接从 UIControlEvents 调用委托方法是一种很好的做法。无论如何,它是 msg_send 的基本等价物,因为按钮从您的目标和选择器参数构建调用。并且它不会产生调用中间人方法会导致的轻微惩罚,从而消除开销。

于 2012-05-10T03:49:52.493 回答