Objective c 捕获原始子类中的委托方法调用
我可以试着用UIScrollView来解释这一点Objective c 捕获原始子类中的委托方法调用,objective-c,uiscrollview,delegates,nsobject,uiscrollviewdelegate,Objective C,Uiscrollview,Delegates,Nsobject,Uiscrollviewdelegate,我可以试着用UIScrollView来解释这一点 我将创建UIScrollView的子类。我希望能够响应它自己的委托方法,例如scrollViewDidScroll,但同时让委托设置为正常。我如何才能不干扰委托属性,但仍然使子类能够响应其自己的委托调用?如果您只关心scrollViewDidScroll,只需覆盖layoutSubviews: - (void)layoutSubviews { [super layoutSubviews]; // your code here }
我将创建UIScrollView的子类。我希望能够响应它自己的委托方法,例如scrollViewDidScroll,但同时让委托设置为正常。我如何才能不干扰委托属性,但仍然使子类能够响应其自己的委托调用?如果您只关心
scrollViewDidScroll
,只需覆盖layoutSubviews
:
- (void)layoutSubviews {
[super layoutSubviews];
// your code here
}
UIScrollView
在将scrollViewDidScroll:
发送给其代理之前,将自身发送layoutSubviews
。这需要一些时间,但您可以实现您想要的
//已编辑
我添加了方法forwardInvocation:
的实现。当对象无法识别发送给它的消息时,在对象上调用此方法
在我们的例子中,当调用一些UIScrollView
委托的方法时,我们的子类和它没有实现被调用的方法时,将调用forwardInvocation
。此方法检查被调用的选择器是否是UIScrollViewDelegate
协议的一部分。如果是并且类的“true”委托响应此选择器,我们将调用调用的选择器转发给自定义委托
也就是说,使用此解决方案,您不必在子类中实现UIScrollViewDelegate
协议的所有方法。中标方法的执行情况;在ScrollView的子类中实现的t将被转发给子类的“true”代表
例如:
#import <objc/runtime.h>
@protocol YourSubclassDelegate<UIScrollViewDelegate>
@end
@interface YourSubclass ()
@property (nonatomic, weak) id<YourSubclassDelegate> delegate;
@end
@implementation
//override delegate setter
- (void)setDelegate:(UIScrollViewDelegate)delegate
{
self.customDelegate = delegate;
[super setDelegate:self];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
//do something you want
if ([self.customDelegate respondsToSelector:@selector(scrollViewDidScroll:)]) {
[self.customDelegate scrollViewDidScroll:self];
}
}
- (id)forwardingTargetForSelector:(SEL)selector
{
struct objc_method_description methodDescription = protocol_getMethodDescription(@protocol(UIScrollViewDelegate), selector, YES, YES);
if(NULL != methodDescription.name) {
if ([self.customDelegate respondsToSelector:selector]) {
return self.customDelegate;
}
}
return nil;
}
@end
#导入
@协议子类委托
@结束
@接口子类()
@属性(非原子,弱)id委托;
@结束
@实施
//重写委托设置器
-(void)setDelegate:(UIScrollViewDelegate)委托
{
self.customDelegate=委托;
[超级代表:自我];
}
-(无效)scrollViewDidScroll:(UIScrollView*)scrollView
{
//做你想做的事
if([self.customDelegate respondsToSelector:@selector(scrollViewDidScroll:)])){
[self.customDelegate scrollViewDidScroll:self];
}
}
-(id)ForSelector的转发目标:(SEL)选择器
{
struct objc_method_description methodDescription=protocol_getMethodDescription(@protocol(UIScrollViewDelegate),选择器,YES,YES;
if(NULL!=methodDescription.name){
if([self.customDelegate respondsToSelector:selector]){
返回self.customDelegate;
}
}
返回零;
}
@结束
您可以向自定义UIScrollView添加第二个委托,这是trigger-its-owns方法。@Larme感谢您的输入,但这并不是我要问的,如果我不清楚,很抱歉。我希望delegate类能够实现UIScrollViewDelegate必须提供的所有委托方法。但我只想“监听”一些特定的委托方法,我不想实现子类中的每一个委托方法,这样我就可以将它们引入到它自己的委托中。这种方法的可能重复是好的,但是,通过使用扩展UIScrollViewDelegate协议的新协议,您可以节省响应选择器的工作customDelegate
将符合此新协议,并且只有在对象符合新协议的情况下才会在setDelegate
中设置。是的,这是我的解决方案,我很高兴其他人也想到了。但我想一定有更好的办法。我已经更新了我的答案。完成您想要的结果需要更少的代码。很好!!,我没有想到这一点。这实际上适用于scrollViewDidScroll,完全符合我的需要,谢谢。但它实际上并没有回答这个问题,所以我不认为我应该把它作为答案。很抱歉