ios - 设置 self.delegate = self 是不是糟糕的设计

标签 ios objective-c delegates protocols

我有一个 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/

相关文章:

c# - EndInvoke() 是可选的、某种可选的还是绝对不是可选的?

ios - 将委托(delegate)设置为类类型而不是 Swift 中的实例

ios - NSMutableArray 到 UITableView

iphone - iOS 应用程序的 Twitter 集成

objective-c - 将 block 转换为 void* 以进行动态类方法解析

objective-c - 如何从静态单元格表​​ View 中删除部分

iphone - 委托(delegate)不工作(与 Restkit 相关?)

C#委托(delegate): Do i use this correctly?

ios - 为什么我在这段代码中得到 "Only instance methods can be declared @IBAction"?

iphone - 应用程序于11.13被拒绝(新用户注册不合适)