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
,但我没有得到任何结果
我将向您展示一些我正在尝试的代码:
MyCustomTableView.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;
}