一个ViewController与2个TableViews - 应用程序崩溃

时间:2014-05-10 00:54:53

标签: ios uitableview

我有一个View控制器管理2个tableviews。我使用一个标志来跟踪选择哪个表。在每个委托函数中,我只需检查标志并使用正确的表。

除了当我加载第二个表格比第一个表项少的表格时,一切都很有效,当我滚动表格时崩溃,出现以下错误。

 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'no object at index 2 in section at index 0'

* 第一次抛出调用堆栈:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"Drawing Row = %d Total num Of items = %d", indexPath.row, [[self.fetchedResultsControllerComments fetchedObjects] count]);

打印出来:

Drawing Row = 2 Total num Of items = 0

如果此表中的项目数是正确的,那么为什么首先调用此函数?

以下是代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(currentSelectionTableType1)
    {
        // Draw first kind of cell.
        PlainImageCell *cell1 = [tableView dequeueReusableCellWithIdentifier:@"ImageCell"];
        if(cell1 == nil)
            cell1 =[[PlainImageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"ImageCell"];
        [self configureCell1:cell1 atIndexPath:indexPath];
        return cell1;
    }
    // else Draw the second kind of cell
    PlainTextCell *cell2 = [tableView dequeueReusableCellWithIdentifier:@"TextCell"];
    if(cell2 == nil)
        cell2 =[[PlainTextCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TextCell"];
     [self configureCell2:cell2 atIndexPath:indexPath];
     return cell2;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    if(currentSelectionTableType1)
        return [[self.fetchedResultsControllerDataSource1 sections] count];
    return [[self.fetchedResultsControllerDataSource2 sections] count];
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    id <NSFetchedResultsSectionInfo> sectionInfo;
    if(currentSelectionTableType1)
    {
        sectionInfo = [self.fetchedResultsControllerDataSource1 sections][section];
    }
    else
    {
        sectionInfo = [self.fetchedResultsControllerDatasource2 sections][section];
    }
    return [sectionInfo numberOfObjects];

} THX

1 个答案:

答案 0 :(得分:1)

编辑 - 根据您添加的代码: 您需要在条件之前定义一个单元格,然后根据条件配置该单元格,然后在条件之后返回单元格。如果您同时需要ImageView和TextCell,则可以在条件代码中配置这些对象。

为什么不使用一个带两个数据源的TableView并根据需要切换数据源?

这样的事情:

@property(nonatomic, strong) NSArray *tableViewDataSource1;
@property(nonatomic, strong) NSArray * tableViewDataSource2;
@property(nonatomic) BOOL  usingDataSource2;

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (self.usingDataSource2) {
        return [self.tableViewDataSource2 count];
    }

    return [self. tableViewDataSource1 count];    
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // Create the cell before conditional
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuseIdentifier" forIndexPath:indexPath];

    // Conditionally configure the cell
    if (self.usingDataSource2) {
        // Configure Cell using self.tableViewDataSource2 data
    } else {
        // Configure Cell using self.tableViewDataSource1 data
    }

    // Return the configured cell after the conditional
    return cell;  
}