UITableView委托方法没有被调用?
我想要提取的UITableView委托方法为称作BaseTableProvider
UITableView委托方法没有被调用?
//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的子类中的基类,并在子类中
//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
我重写2的UITableViewDelegate方法在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;
}
但我不能看到建在菜单的屏幕细胞debuged代码中发现,在RSFeedListTableProvider的UITableView委托方法不是called.Any一个能帮助我吗?谢谢!
我想你没有在你的子类RSFeedListTableProvider
中实现numberOfRowsInSection
数据源方法。因此,它会调用父类实现
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 0;
}
有你正在返回零,所以cellForRowAtIndexPath
在子类中永远不会被调用。
解决方案实现numberOfRowsInSection
在子类和返回适当的计数
是的!我弄错了NumberOfRowsInSection和numberOfSection.Thank你这么多! –
也许你是继承NSObject而不是UITableViewController!你需要创建属性UITableView * tableView,并连接到你的UITableViewController数据源和委托。
我有一个名为feedListView的tableView类,并在RSFeedListViewController.m中分配dataSource和delegate(代码部分3) –
但是你的RSBaseTableProvider继承了NSObject。 –
几个意见......我没有看到你在哪里返回给定部分的行数。另外,如果你从storyboard或xib加载'RSFeedListViewController',它会调用'init'的“解码器”版本而不是nib名称版本。 –
@PhillipMills我忘了粘贴代码,我在BaseProvider.m中返回部分的数量 –
如果您在'self.feedListView.tableView.delegate = _provider;'处输出'_provider'的值,您会看到什么? –