我在我的应用程序中继承了UITableView。它已经成为了它自己的代表。
@interface TableView : UITableView <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, assign) id delegate;
- (id)initWithFrame:(CGRect)frame;
@end
@implementation TableView
@synthesize delegate;
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
UIView *footerView = [[UIView alloc] initWithFrame:CGRectMake(0, self.frame.size.height-144, self.frame.size.width, 40)];
super.delegate = self;
super.dataSource = self;
self.tableFooterView = footerView;
}
return self;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 15;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
return [self.delegate tableView:tableView cellForRowAtIndexPath:indexPath];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
NSLog(@"Selected row!");
}
@end
现在,我不了解的是我如何将TableView作为UITableView的委托,但也有一个不同的委托属性,它有时会管理一些函数。因此,我希望 - 例如 - numberOfRowsInSection由此类处理,但是 - 例如 - didSelectRowAtIndexPath将被转发到UIViewController或其他任何呈现它。
答案 0 :(得分:1)
每个委托方法都有一个属性(UITableView *)tableView
,您可以使用它来识别要执行的表视图
例如,假设您有2个表格视图 tableView1 &amp; tableView2 现在做类似这样的事情
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if tableView == self {
return [self.delegate tableView:tableView cellForRowAtIndexPath:indexPath];
} else if tableView == tableView2 {
// Do something
}
}
你可以使用超级和自我调用来做同样的概念
修改强>
创建一个名为customDelegate
的属性,现在在ViewController集customDelegate = self
中并保持TableView的委托相同
现在,当你希望类应该处理调用时,不要做任何事情,因为行为是默认的
但是如果你希望你的viewController应该处理调用,那么只需使用该customDelegate属性来管道它
例如
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if <SOME_CONDITION> {
// This will cause the TableView's delegate to be called
return [self.delegate tableView:tableView cellForRowAtIndexPath:indexPath];
} else {
// We wish the ViewController to handler this action then
return [self.customDelegate tableView:tableView cellForRowAtIndexPath:indexPath];
}
}