Ios 如何从委托转发所有方法?

Ios 如何从委托转发所有方法?,ios,objective-c,uitableview,delegates,forward,Ios,Objective C,Uitableview,Delegates,Forward,我正在对UITableView及其协议UITableViewDelegate及其“datasource”UITableDataSource进行子类化,一切正常,但我还没有找到从UITableView转发“delegate”和“datasource”方法的干净方法 我曾尝试“玩”过respondsToSelector:、forwardingTargetForSelector:和forwardInvocation:方法的NSObject,但我没有得到任何结果 我将向您展示一些我正在尝试的代码: My

我正在对
UITableView
及其协议
UITableViewDelegate
及其“datasource”
UITableDataSource
进行子类化,一切正常,但我还没有找到从
UITableView
转发“delegate”和“datasource”方法的干净方法

我曾尝试“玩”过
respondsToSelector:
forwardingTargetForSelector:
forwardInvocation:
方法的
NSObject
,但我没有得到任何结果

我将向您展示一些我正在尝试的代码:

My
CustomTableView.h

@protocol TableViewCustomDelegate <UITableViewDelegate>

- (void) anyCustomMethodDelegate;

@end

@protocol TableViewCustomDataSource <UITableViewDataSource>

- (NSInteger) anyCustomMethod;

@end


@interface TableViewCustom : UITableView <UITableViewDelegate, UITableViewDataSource>

@property (nonatomic, weak) id<TableViewCustomDelegate> myDelegate;
@property (nonatomic, weak) id<TableViewCustomDataSource> myDataSource;

@end
我想避免将其转发给“myDelegate”

我认为应该像我在代码中所做的那样,使用
responsetoselector:
forwardingTargetForSelector:
,但它不起作用。我不知道我是做错了还是不可能

提前谢谢


问候

我可能误解了您的意图,但是如果您只是想让子类使用标准委托和数据源,那么就不要使用这些方法,而是将您想要的委托/数据源交给子类。e、 g

MyTableViewSubclass *tableView = [[MyTableViewSubclass alloc] initWithFrame:....];
tableView.datasource = // anything that implements UITableViewDatasource
tableView.delegate = // anything that implements UITableViewDelegate

然后不要对子类中的那些属性或协议做任何特殊的处理。

请查看注释行以获取解释

- (void) setMyDelegate:(id<TableViewCustomDelegate>)delegate
{
    //you told you will handle delegate methods to SUPER in our case UITableView

    [super setDelegate:self]; 
    _myDelegate = delegate;   //You have internally stored the delegate 
}

为了使消息传递正常工作,您需要实现以下方法:

-(void)forwardInvocation:(NSInvocation *)invocation {
    SEL aSelector = [invocation selector];

    if ([self.myDelegate respondsToSelector:aSelector]) {
        [invocation invokeWithTarget:self.myDelegate];
    }
}

-(NSMethodSignature*)methodSignatureForSelector:(SEL)selector {
    NSMethodSignature *signature = [super methodSignatureForSelector:selector];

    if (nil == signature) {
        signature = [self.myDelegate methodSignatureForSelector:selector];
    }
    return signature;
}

您不必转发自定义的
UITableView
子类的方法。只需将您的控制器指定为tableview的委托和数据源,它就可以在不应用任何附加逻辑的情况下工作。您通常不需要子类化
UITableView
。您有什么特别想要完成的吗?同意UITableView不应该因为委托/数据源的原因而被子类化。虽然您所描述的内容可以工作,但我认为这过于复杂,不是正确的解决方案。Danh关于将另一个对象设置为数据源和/或委托的建议似乎要简单得多。是的,没有注意到他的答案。在这里提问之前,我也尝试了你的解决方案,但没有得到成功的结果。我认为Danh的解决方案更简单,这足以满足我的意图。Danh,你明白了吗。我已经检查了您的解决方案,我认为它更清晰、更安全。谢谢你的回答。
  //You are overriding this method
  //Table View will not handle this as you have overridden.
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
      //You check whether your delegate can do that.
     if ([self.delegateDelegate respondsToSelector:@selector(tableView:viewForHeaderInSection:)]) 
     {
           return [self.myDelegate tableView:tableView
                       viewForHeaderInSection:section];
      }
       //If you delegate is not doing, you need to handle that
       // However returning nil. So Instead of UIView the framework gets nil
       //You need to handle this if your delegate is not handling this
      return nil;
  }
-(void)forwardInvocation:(NSInvocation *)invocation {
    SEL aSelector = [invocation selector];

    if ([self.myDelegate respondsToSelector:aSelector]) {
        [invocation invokeWithTarget:self.myDelegate];
    }
}

-(NSMethodSignature*)methodSignatureForSelector:(SEL)selector {
    NSMethodSignature *signature = [super methodSignatureForSelector:selector];

    if (nil == signature) {
        signature = [self.myDelegate methodSignatureForSelector:selector];
    }
    return signature;
}