我有一个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实例的类可能决定将自己设置为委托。
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 /委托设计模式(或只是一个糟糕的设计)来说:
self.delegate = self;
答案 0 :(得分:6)
将委托设置为self
绝对没问题。实际上,如果没有其他人设置委托,这是提供默认委托功能的好方法。
显然,delegate
属性必须声明weak
,否则你会得到一个参考周期。
为了扩展一点,在阅读了错误的答案和错误的评论之后,如果你允许一个对象成为它自己的委托,那么你的代码就更清晰了,因为你不必用
完全包围每一个委托调用。if ([self delegate] != nil)
{
[[self delegate] someMethod];
}
else
{
[self someMethod];
}
答案 1 :(得分:0)
分配self.delegate = self的方法不正确。 为了您的功能,您可以这样做:
-(void) doSomethingOnYourOwn
{
// DO some stuff here
self.targetChangedDelegate = nil;
}
并且在使用委托时:
if(self.targetChangedDelegate != nil && [self.targetChangedDelegate respondsToSelector:@selector(targetChanged)]
{
[self.targetChangedDelegate targetChanged];
}
else
{
[self targetChanged];
}
答案 2 :(得分:0)
设置self.delegate = self是不好的设计。它应该是另一个对象。通过协议进行委派是子类化的一种替代设计,您可以在此处阅读有关委派的更多信息: