Rau*_*nak 2 delegates protocols objective-c ios
我有一个UIViewController子类(比如MyViewController).
MyViewController.h
@protocol TargetChangedDelegate
-(void) targetChanged;
@end
@interface MyViewController
@property (weak) id<TargetChangedDelegate> targetChangedDelegate;
-(void) doSomethingOnYourOwn;
@end
Run Code Online (Sandbox Code Playgroud)
MyViewController.m
@implementation MyViewController <TargetChangedDelegate>
-(void) doSomethingOnYourOwn
{
// DO some stuff here
// IS THIS BAD ??
self.targetChangedDelegate = self;
}
-(IBAction) targetSelectionChanged
{
[self.targetChangedDelegate targetChanged];
}
-(void) targetChanged
{
// Do some stuff here
}
@end
Run Code Online (Sandbox Code Playgroud)
基于某些条件,实例化MyViewController实例的类可能决定将自己设置为委托.
Foo.m
@property(strong) MyViewController *myVC;
-(void) configureViews
{
self.myVC = [[MyViewController alloc] init];
[self.view addSubview:self.myVC];
if (someCondition)
{
self.myVC.targetChangedDelegate = self;
}
else
{
[self.myVC doSomethingOnYourOwn]
//MyViewController sets itself as the targetChangedDelegate
}
}
Run Code Online (Sandbox Code Playgroud)
参考上面的代码片段,我有以下问题:是否违反MVC /委托设计模式(或只是一个糟糕的设计)来说:
self.delegate = self;
Run Code Online (Sandbox Code Playgroud)
将委托设置为绝对没有问题self.实际上,如果委托不是由其他人设置的,那么它是提供默认委托功能的好方法.
显然,delegate必须声明属性,weak否则您将获得参考周期.
为了扩展一点,阅读上面的错误答案和错误的评论,如果你允许一个对象成为它自己的委托,你的代码就更清晰,因为你不必完全包围每一个委托调用
if ([self delegate] != nil)
{
[[self delegate] someMethod];
}
else
{
[self someMethod];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1293 次 |
| 最近记录: |