UITableView委托方法没有被调用?

问题描述:

我想要提取的UITableView委托方法为称作BaseTableProviderUITableView委托方法没有被调用?

//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一个能帮助我吗?谢谢!

+0

几个意见......我没有看到你在哪里返回给定部分的行数。另外,如果你从storyboard或xib加载'RSFeedListViewController',它会调用'init'的“解码器”版本而不是nib名称版本。 –

+0

@PhillipMills我忘了粘贴代码,我在BaseProvider.m中返回部分的数量 –

+0

如果您在'self.feedListView.tableView.delegate = _provider;'处输出'_provider'的值,您会看到什么? –

我想你没有在你的子类RSFeedListTableProvider中实现numberOfRowsInSection数据源方法。因此,它会调用父类实现

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

有你正在返回,所以cellForRowAtIndexPath在子类中永远不会被调用。
解决方案实现numberOfRowsInSection在子类和返回适当的计数

+0

是的!我弄错了NumberOfRowsInSection和numberOfSection.Thank你这么多! –

也许你是继承NSObject而不是UITableViewController!你需要创建属性UITableView * tableView,并连接到你的UITableViewController数据源和委托。

+0

我有一个名为feedListView的tableView类,并在RSFeedListViewController.m中分配dataSource和delegate(代码部分3) –

+0

但是你的RSBaseTableProvider继承了NSObject。 –