tableView reloadData上没有调用cellForRowAtIndexPath

时间:2010-03-12 00:21:25

标签: iphone

我在一个视图上有一个UITableView,它在应用程序开始时加载数据,然后当用户在框中输入文本并点击按钮时,我重新查询数据库,重新填充原始NSMutableArray存储表的数据。

所有这一切都很完美。在一些日志语句中,我可以告诉数组有正确的信息,numberOfRowsInSection方法返回正确的计数,并在调用重载后调用。

但是,第二次调用cellForRowAtIndexPath(重新加载后)并且表数据永远不会更新。

我花了几个小时搜索网络,但我发现没有任何帮助。有人可以帮忙吗?

所有代码均位于: http://github.com/botskonet/inmyspot

正在调用特定的重新加载: http://github.com/botskonet/inmyspot/blob/master/Classes/InMySpotViewController.m

大致94号线

自: http://github.com/botskonet/inmyspot/blob/master/Classes/PlateFormViewController.m

大致上101行

更多信息:一旦新数据被添加到mutablearray,如果我尝试开始滚动表,它最终会死于:

“由于未捕获的异常'NSRangeException'终止应用程序,原因:'*** - [NSCFArray objectAtIndex:]:索引(29)超出边界(29)'”

我假设这意味着表格单元格无法找到数组中的任何数据以匹配滚动位置,这似乎是因为数组具有新数据,但表格没有。

6 个答案:

答案 0 :(得分:3)

我看到了同样的问题。我的问题很相似:我有一个UIViewController子类(MyViewController),它包含一些内容,包括对我的UITableViewController (MyTableViewController)子类的引用。在MyViewController.xib中,为了确保MyViewController加载的tableView与MyTableViewController中加载的tableView相同,在Interface Builder中我连接了来自tableView在MyViewController中,并指向MyTableViewController's查看属性。

这是一张图片,因为Interface Builder中的操作很难描述: enter image description here

答案 1 :(得分:1)

您的重新加载未被调用,因为您尚未正确设置UITableView的委托。

@interface InMySpotViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource>{
}

你也可以在这里覆盖mainDelegate.plates:

NSMutableArray *platesArray = [[NSMutableArray alloc] init];
                mainDelegate.plates = platesArray;
                [platesArray release];

为什么不组合你的两个控制器。你这样做的方式导致了你的大多数问题。您在PlateFormViewController中不必要地创建了一个新的InMySpotViewController。

答案 2 :(得分:1)

plateLookup中,您破坏现有数组:

    NSMutableArray *platesArray = [[NSMutableArray alloc] init];
    mainDelegate.plates = platesArray;
    [platesArray release];

在此之后重新加载表格。该数组具有零元素,因此永远不会调用cellForRowAtIndexPath:

编辑: 您还可以创建一个新的视图控制器

        InMySpotViewController *viewController = [[InMySpotViewController alloc] init]; 
        [viewController refreshTable];

所以你甚至没有重新加载屏幕上可见的表格。

答案 3 :(得分:1)

感谢家庭成员的一些调试,我确定了以下问题是原因:

inMySpotViewController设置为UITableViewController而不是UIViewController,这就是桌子覆盖其他所有内容的原因。我将其更改为UIViewController,然后添加了新的UITableView

IBOutlet UITableView *myTblView;
@property (nonatomic, retain) UITableView *myTblView;

然后在我的代码中引用该表视图。此代码在单视图分支上完成,因此它现在正常工作。

platesArray一直被提到是一个问题,但并不是因为数据被成功更新而发生了越界,而表视图却没有(因此我试图滚动到数组中的索引)不存在,但我知道这是问题,因为他们的表没有在视觉上更新)。

在重新编写它的值后,我已经成功注销了修改后的plate数组的内容,并且它们都是正确的,并且plates.count返回了正确的值,所以它无论如何都没有被“破坏”。

感谢大家的帮助!

答案 4 :(得分:0)

我有同样的问题,我跟踪它在界面中有一个tableView属性。我不认为我自己添加了这个,但是谁在乎,它掩盖了UITableViewController自己的tableView属性。我删除它,项目继续构建,但现在当我从推送的viewcontroller返回到第一个UITableViewController时,正确的顺序发生。

答案 5 :(得分:0)

我遇到了同样的问题。谷歌的大部分答案都谈到了 delegate 。但我确信我的 delegate data source 已正确设置。

后来,我发现问题是这个方法的返回值:

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

在我的代码中,我重写了这样的方法:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return _dataArray.count;
}

但是在检查这个断点时,我发现_dataArray在某种程度上是零。此方法应返回正整数,否则返回

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

可能不会被调用。

我希望它有所帮助。