将UITableViewDataSource方法与静态单元格一起使用

时间:2015-02-19 11:15:47

标签: ios objective-c uitableview

首先,不要马上将其标记为重复。我知道不推荐使用UITableViewDataSource方法和静态单元格,通常会导致崩溃,但我想知道导致这种情况的行为。

在IB中,我有一个UITableViewController,在一个部分中有10个不同的静态单元格。我希望能够在不使用原型单元的情况下重新排列并将它们分成多个部分,因为它们永远不会被重用。以下是我对数据源方法的实现:

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

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [(NSArray*)self.indexMappings[section] count];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    UITableViewCell *cell;
    NSIndexPath *mappedIndexPath = [self getMappedIndexPathForIndexPath:indexPath];
    cell = [super tableView:tableView cellForRowAtIndexPath:mappedIndexPath];
    return cell;
}

这里的问题是,如果self.indexMappings.count大于静态表中的部分数,则应用程序崩溃。但如果它小于或等于,映射就可以了。为了澄清,self.indexMappings是一个二维NSArray*。有人知道这种行为的原因吗?

1 个答案:

答案 0 :(得分:0)

我发现这样做的方法是也实现一些UITableViewDataSource方法。当应用程序崩溃时,可以从调用堆栈中看出导致问题的方法是确定页眉或页脚高度或页眉或页脚视图等的方法。在实现以下方法后返回一些默认值,问题解决了。​​

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;

-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;

-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;

-(NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath;

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;