在iOS中,我们很多情况下都需要自定义控件,而自定义控件我们通常都是先继承自系统控件,然后进行一系列扩充,但我发现当我继承了本身拥有delegate属性的控件时,想要在自定义控件类内部拿到delegate方法出现了问题,下面我以UIScrollView为例进行说明:
1、第一个想法是直接在重写父类的初始化方法时设置self.delegate = self,这样虽然可以在类内部直接调用代理方法,但是这样严重的问题是如果外部(比如在viewController中)为该控件设置了代理,那么内部设置的代理就被覆盖了,所以在发生相应事件时也不会调用类内部的代理方法了。
- (instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
self.delegate = self;
return self;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
self.delegate = self;
return self;
}
2、第二个想法是为这个新类重新设置一个区别于delegate的myDelegate属性,然后重新定制所有父类所遵循的代理协议的所有方法,然后也是在类内部设置delegate = self,然后在所有delegate方法内部向新的delegate发送对应的消息,这样在类内部和外部都可以获取到delegate方法了,但是这样同样也有一个问题就是外部只能规定设置myDelegate属性,万一