ios - UITableView 委托(delegate)方法没有被调用?

标签 ios objective-c uitableview

我正在尝试将 UITableView Delegate 方法提取到名为 BaseTableProvider 的基类中

//BaseTableProvider.h
@protocol RSTableProviderProtocol <NSObject>

- (void)cellDidPress:(NSIndexPath *) atIndexPath;

@optional
- (void)cellNeedsDelete:(NSIndexPath *) atIndexPath;

@end

@interface RSBaseTableProvider : NSObject <UITableViewDelegate, UITableViewDataSource>

@property (nonatomic, strong) NSMutableArray *dataSource;
@property (nonatomic, weak) id<RSTableProviderProtocol> delegate;

@end
//BaseTableProvider.m
@implementation RSBaseTableProvider
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [[UITableViewCell alloc]init];
    return cell;
}
@end

然后我创建了 BaseTableProvider 的子类,并重写子类中的两个 UITableViewDelegate 方法

//RSFeedListTableProvider.h
@interface RSFeedListTableProvider : RSBaseTableProvider

@end

//RSFeedListTableProvider.m
@implementation RSFeedListTableProvider

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return [self.dataSource count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    RSFeedCell *cell = (RSFeedCell *)[tableView dequeueReusableCellWithIdentifier:kFeedCell];

    if(cell == nil){
        cell = [[RSFeedCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kFeedCell];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    Feed *feed = (Feed *)self.dataSource[indexPath.row];

    if (feed != nil) {
        cell.titleText = feed.title;
        cell.subTitleText = feed.summary;
    }


    return cell;
}

@end

我在 ViewController 中初始化了 ListTablerProvider。

//RSFeedListViewController.m
@implementation RSFeedListViewController

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    _feedListView = [[RSFeedListView alloc] init];

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    _provider = [[RSFeedListTableProvider alloc] init];
    _provider.delegate = self;

    return self;
}

#pragma mark -- Life Cycle

- (void)loadView{
    RSFeedListView *aView = [[RSFeedListView alloc] initWithFrame:[UIScreen mainScreen].bounds];

    self.feedListView = aView;
    self.view = aView;

    self.feedListView.tableView.delegate = _provider;
    self.feedListView.tableView.dataSource = _provider;
}

但是我看不到屏幕上构建的单元格。我调试代码发现没有调用 RSFeedListTableProvider 中的 UITableView 委托(delegate)方法。有人可以帮助我吗?谢谢!

最佳答案

我认为您没有在子类 RSFeedListTableProvider 中实现 numberOfRowsInSection 数据源方法。所以它将调用父类(super class)实现

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 0;
}

并且您将返回,因此永远不会调用子类中的cellForRowAtIndexPath
解决方案是在子类中实现 numberOfRowsInSection 并返回正确的计数

关于ios - UITableView 委托(delegate)方法没有被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38039889/

相关文章:

objective-c - 在 Objective-C 中实现真/假/未定义三分变量的最佳方法

ios - 如何通过标题中的按钮按下来确定 UITableView 中的当前部分

swift - 带有阴影和角半径的分组 UITableView?

ios - iPad 中的 PDF 搜索和突出显示

ios - UICollectionView — 缩放单元格以适合屏幕

ios - 将快照字典从 firebase 数据库保存到类对象

ios - 用单例更改单元格文本?

iphone - 如何将 1 分钟的时间间隔添加到 iPhone 中的 NSDate 对象

objective-c - 哪些类可以复制?

ios - NSPredicate 获取核心数据