如何使用委托子类UITableView?

时间:2017-03-10 12:44:29

标签: ios objective-c uitableview delegates

我在我的应用程序中继承了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或其他任何呈现它。

1 个答案:

答案 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];
    }
}