NSObject(QMUIMultipleDelegates)

@interface NSObject (QMUIMultipleDelegates)

让所有 NSObject 都支持多个 delegate,默认只支持属性名为 delegate 的 delegate(特别地,UITableView 和 UICollectionView 额外默认支持 dataSource)。 使用方式:将 qmui_multipleDelegatesEnabled 置为 YES 后像平时一样 self.delegate = xxx 即可。 如果你要清掉所有的 delegate,则像平时一样 self.delegate = nil 即可。 如果你把 delegate 同时赋值给 objA 和 objB,而你只要移除 objB,则可:[self qmui_removeDelegate:objB]

如果你要让其他命名的 delegate 属性也支持多 delegate,则可调用 qmui_registerDelegateSelector: 方法将该属性的 getter 传进去,再进行实际的 delegate 赋值,例如你的 delegate 命名为 abcDelegate,则你可以这么写: [self qmui_registerDelegateSelector:@selector(abcDelegate)]; self.abcDelegate = delegateA; self.abcDelegate = delegateB;

Warning

不支持 self.delegate = self 的写法,会引发死循环,有这种需求的场景建议在 self 内部创建一个对象专门用于 delegate 的响应,参考 _QMUITextViewDelegator。
  • 当你需要当前的 class 支持多个 delegate,请将此属性置为 YES。默认为 NO。

    Declaration

    Objective-C

    @property (nonatomic) BOOL qmui_multipleDelegatesEnabled;

    Swift

    var qmui_multipleDelegatesEnabled: Bool { get set }
  • 让某个 delegate 属性也支持多 delegate 模式(默认只帮你加了 @selector(delegate) 的支持,如果有其他命名的 property 就需要自己用这个方法添加)

    Declaration

    Objective-C

    - (void)qmui_registerDelegateSelector:(SEL)getter;

    Swift

    func qmui_registerDelegateSelector(_ getter: Selector!)
  • 移除某个特定的 delegate 对象,例如假设你把 delegate 同时赋值给 objA 和 objB,而你只要移除 objB,则可:[self qmui_removeDelegate:objB]。但如果你想同时移除 objA 和 objB(也即全部 delegate),则像往常一样直接 self.delegate = nil 即可。

    Declaration

    Objective-C

    - (void)qmui_removeDelegate:(id)delegate;

    Swift

    func qmui_removeDelegate(_ delegate: Any!)