我有一个 UIViewController 子类(比如 MyViewController)。
MyViewController.h
@protocol TargetChangedDelegate
-(void) targetChanged;
@end
@interface MyViewController
@property (weak) id<TargetChangedDelegate> targetChangedDelegate;
-(void) doSomethingOnYourOwn;
@end
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
根据某些条件,实例化 MyViewController 实例的类可能会决定是否将自己设置为委托(delegate)。
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
}
}
引用上面的代码片段,我有以下问题: 是否违反了 MVC/委托(delegate)设计模式(或者只是一个糟糕的设计):
self.delegate = self;
最佳答案
将委托(delegate)设置为self
绝对没有问题。事实上,如果委托(delegate)不是由其他人设置的,这是提供默认委托(delegate)功能的好方法。
显然,delegate
属性必须声明为weak
,否则会出现引用循环。
扩展一点,阅读了上面的错误答案和错误评论后,如果您允许一个对象成为它自己的委托(delegate),您的代码会更简洁,因为您不必用
完全包围每个委托(delegate)调用if ([self delegate] != nil)
{
[[self delegate] someMethod];
}
else
{
[self someMethod];
}
关于ios - 设置 self.delegate = self 是不是糟糕的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42691403/