【发布时间】:2017-03-09 09:24:39
【问题描述】:
我有一个 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
}
}
参考上面的sn-p代码,我有如下问题: 是否违反 MVC/委托设计模式(或只是一个糟糕的设计)说:
self.delegate = self;
【问题讨论】:
-
不就是某种actor模型表示吗?
-
还不错,是错的。当您可以轻松调用没有委托的方法时,为什么要将委托设置为self,作为同一类中委托的定义。当您处理其他一些课程时这是正确的,但在同一个课程中毫无意义。
-
不确定你想通过这样做来完成什么,可以很容易地用
[myVC doSth]调用函数 -
@iphonic 我同意这不是常态,但有原因。特别是在使用子类化时。是好的设计吗? ..也许不是,也许是,但它是务实的。 - 无论我投票结束它,因为它只会产生固执己见的答案
标签: ios objective-c delegates protocols