Objective c 捕获原始子类中的委托方法调用

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来解释这一点


我将创建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,完全符合我的需要,谢谢。但它实际上并没有回答这个问题,所以我不认为我应该把它作为答案。很抱歉