该控制器有一个子控制器,它使用很少的方法实现Delegate协议。
ParentController : UIViewController <ChildControllerDelegate>
父控制器有一个从内部调用的方法(让我们称之为doSomething
)。
现在,我需要从子控制器内的按钮调用此doSomething
方法。所以我可以想到3个选项:
pleaseCallDoSomething
添加方法并从按钮调用此方法,然后在父视图控制器中实现此pleaseCallDoSomething
方法,最后调用doSomething
内的pleaseCallDoSomething
1}}。第二个选项是不在子视图协议中注册新方法,只需使用:
[btn addTarget:self.delegate action:@selector(doSomething) forControlEvents:UIControlEventTouchUpInside];
将doSomething
方法添加到协议并在父视图控制器上实现,然后在父视图控制器内部在需要时在本地调用它。 (我的意思是从委托和本地调用委托方法。)
什么是最佳做法?
由于 沙尼
答案 0 :(得分:1)
您不应将代理绑定为按钮的目标。您的委托属性很可能被声明为弱以避免保留周期。如果将其指定为目标,则将获得保留周期,并且只要不删除该按钮,就不会释放整个对象层次结构。
亲本LT; - 强 - &GT;子&lt; - 弱 - &GT;父
亲本LT; - 强 - &GT;按钮
目标分配后
亲本LT; - 强 - &GT;子&lt; - 强 - &GT;按钮&LT; - 强 - &GT;父
此外,您的按钮不应该知道有关控制器层次结构的任何信息,因此我认为让您的视图与其他对象进行通信而不是它们所源自的控制器是不好的MVC。这迟早会让人麻烦。
答案 1 :(得分:0)
直接从UIControlEvents调用委托方法是一种很好的做法。它无论如何都是msg_send的基本等价物,因为该按钮构建了来自目标和选择器参数的调用。并且它不会导致调用中间人方法会导致轻微的惩罚,从而消除了开销。