如何转发代表的所有方法?

时间:2014-05-19 19:25:32

标签: ios objective-c uitableview delegates forward

我正在继承UITableView及其协议UITableViewDelegate及其“数据源”UITableDataSource,一切正常,但我找不到从“委托”转发方法的简洁方法“和”数据源“来自UITableView

我尝试使用respondsToSelector:的{​​{1}},forwardingTargetForSelector:forwardInvocation:方法“玩”,但我没有得到任何结果。

我会告诉你一些关于我正在尝试的代码:

我的NSObject

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

TableViewCustom.m

我想避免使用conforms方法将它转发给“myDelegate”。

我认为应该像我在代码中一样使用@implementation TableViewCustom -(BOOL)respondsToSelector:(SEL)aSelector { if ([self.myDelegate respondsToSelector:aSelector]) { return YES; } return [super respondsToSelector:aSelector]; } -(id)forwardingTargetForSelector:(SEL)aSelector { if ([self.myDelegate respondsToSelector:aSelector]) { return self.myDelegate; } return [super forwardingTargetForSelector:aSelector]; } ... ... - (void) setMyDelegate:(id<TableViewCustomDelegate>)delegate { [super setDelegate:self]; _myDelegate = delegate; } - (void) setMyDataSource:(id<TableViewCustomDataSource>)dataSource { [super setDataSource:self]; _myDataSource = dataSource; } .. .. // A method from UITableViewDelegate that I would like to avoid -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { if ([self.delegateDelegate respondsToSelector:@selector(tableView:viewForHeaderInSection:)]) { return [self.myDelegate tableView:tableView viewForHeaderInSection:section]; } return nil; } .. .. @end responsToSelector:,但它不起作用。我不知道我做错了什么或者是不可能。

提前致谢。

的问候。

3 个答案:

答案 0 :(得分:2)

我可能误解了你的意图,但是如果你只是想让你的子类使用标准委托和数据源,那么只需保留这些方法并将子类交给你想要的任何委托/数据源。 e.g。

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

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

答案 1 :(得分:0)

请参阅注释行以获取解释

- (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 
}

查看标题

  //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;
  }

答案 2 :(得分:0)

为了使消息传递起作用,您需要实现以下方法:

-(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;
}