我正在继承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:
,但它不起作用。我不知道我做错了什么或者是不可能。
提前致谢。
的问候。
答案 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;
}