UITableView重绘

时间:2010-11-25 15:26:51

标签: objective-c cocoa-touch ios4

好吧,我现在已经停留了大约3个小时并且阅读了所有其他线程以及我在Google上可以找到的并且做了很多trialAndError,但它没有帮助。请注意,我是Objective C和Cocoa Touch的初学者。

我有一个UITableViewConroller子类。我希望能够以编程方式添加单元格。我重写了以下方法:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    SectionInfo *obj = nil;
    obj = [dataSourceMutableArray objectAtIndex:section];
    return [obj GetNumberOfCells];
}

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = nil;
    CellInfo *cellInfo = nil;
    SectionInfo *si = [dataSourceMutableArray objectAtIndex:indexPath.section];
    cellInfo = [si.cellInfos objectAtIndex:indexPath.row];
    cellInfo.mypath = indexPath;
    cell = cellInfo.cell;

    return cell;
}

CellInfo和SectionInfo对象只是包装器。 sectionInfo包含CellInfo对象的数组,该对象再次包含该单元格。无论我初始化哪个部分和单元格,视图都会按预期绘制。

当我稍后在一个部分添加一个单元格,并调用[tableViewController.tableView reloadData];时,没有任何反应。在“cellForRowAtIndexPath”和“numberOfRowsInSection”中设置断点,表明当我将表视图拖出视线时会调用“cellForRowAtIndexPath”,但是“numberOfRowsInSection”永远不会被再次调用。这可能是问题吗?

我也试过这样的东西:

NSArray* a = [NSArray arrayWithObjects:                      [NSIndexPath indexPathForRow:2 inSection:0],                        [NSIndexPath indexPathForRow:3 inSection:0],                         [NSIndexPath indexPathForRow:2 inSection:1],                        [NSIndexPath indexPathForRow:3 inSection:1],                       nil];

[tableViewController.tableView insertRowsAtIndexPaths:a withRowAnimation:UITableViewRowAnimationNone];

也没有触发任何断点。如果您需要更多信息,请告诉我。我希望我只是失明,你可以发现错误。

2 个答案:

答案 0 :(得分:2)

也许这样做:

[tableViewController.tableView beginUpdates];
[tableViewController.tableView insertRowsAtIndexPaths:a withRowAnimation:UITableViewRowAnimationNone];
[tableViewController.tableView endUpdates];

来自Apple doc:

  在endUpdates返回表之后

  查询查询其数据源和   像往常一样委托行和部分   数据

我通常只需使用reloadData来显示新的行/部分(确保numberOfRow& numberOfSection返回正确数量的项目)。

希望这有帮助。

答案 1 :(得分:0)

好的,对不起,但我的问题没有涵盖我犯的错误。问题是,我缺少设置对我的控制器类的引用。我有时会遇到这个问题,来自提供NullPointerExceptions的语言。因此,如果某些东西不起作用,我对每个人的唯一建议就是检查每个正确初始化的东西。很抱歉让任何人看到这个问题都可以工作。