【问题标题】:Multiple delegates for one object? (follow-up)一个对象的多个代表? (跟进)
【发布时间】:2013-05-14 13:17:02
【问题描述】:

关于Multiple delegates per one object? 的问题,其中一个答案提出了有趣的解决方案(至少对于我天真的眼睛而言):创建一个“委托拆分器”,允许一个对象(在本例中为 UIScrollView)拥有多个委托(在此案例 UIScrollViewDelegate)。

代码如下:

@interface DelegateSplitter : NSObject

-(void)addDelegate:(id)delegate;
-(void)addDelegates:(NSArray*)array;

@end


@interface DelegateSplitter()

@property NSMutableSet *delegates;

@end

@implementation DelegateSplitter

-(id)init
{
   self = [super init];
   _delegates = [NSMutableSet set];
   return self;
}

-(void)addDelegate:(id)delegate
{
  [_delegates addObject:delegate];
}

-(void)addDelegates:(NSArray *)array
{
   [_delegates addObjectsFromArray:array];
}

-(void)forwardInvocation:(NSInvocation *)anInvocation
{
  for (id delegate in _delegates)
  {
     if([delegate respondsToSelector:anInvocation.selector])
     {
        [anInvocation invokeWithTarget:delegate];
     }
   }
}

- (NSMethodSignature*) methodSignatureForSelector: (SEL) selector
{
  NSMethodSignature *our = [super methodSignatureForSelector:selector];
  NSMethodSignature *delegated = [[_delegates anyObject]
                                  methodSignatureForSelector:selector];
  return our ? our : delegated;
}

- (BOOL) respondsToSelector: (SEL) selector
{
   return [[_delegates anyObject] respondsToSelector:selector];
}

这段代码的问题在于它创建了保留循环,并且与普通委托不同,您不能将其声明为

@property (assign) DelegateSplitter *splitter;

然而,它似乎是比包装器“更好”的解决方案。那么有没有办法避免保留循环?

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    您将需要多少代表,只需为其中 3 个代表创建一个属性,如果您需要更多,那么您需要从根本上重新设计您的应用程序...

    更好的方法是为每个活动设置一个委托、一个视图委托、一个数据源和一些异步网络委托等......如果它们最终成为同一个对象,谁在乎......它会工作就好。

    【讨论】:

      猜你喜欢
      • 2018-02-01
      • 1970-01-01
      • 2012-02-18
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多