未调用UITableView cellforrowatindexpath

时间:2009-12-21 09:12:33

标签: uitableview

我对Iphone开发很新。所以,如果我问一些非常简单的问题,请耐心等待。

在我的应用程序中,我有多个视图(即.xib文件)。单击主视图(CouponWebsiteViewController.Xib)上的按钮时,应用程序应加载包含UITable的第二个视图(BrowseList.Xib),并且我必须用一些数据填充该UITable。我编写了以下代码来填充BrowseList.m文件中的数据:

- (void) viewDidLoad{
    arrayData = [[NSArray alloc] init];
    arrayData = [arrayData arrayByAddingObject:@"dfsgdf"];
    arrayData = [arrayData arrayByAddingObject:@"aaaaaa"];
    self.lblNewScreen.text = [arrayData objectAtIndex:0];
    [super viewDidLoad];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [arrayData count];
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] 
                 initWithStyle:UITableViewCellStyleDefault 
                 reuseIdentifier:CellIdentifier] 
                autorelease];
    }

    NSString *cellValue = [arrayData objectAtIndex:indexPath.row];
    cell.textLabel.text = cellValue;
    [tableView setEditing:YES animated:YES];
    return cell;
}

但它没有填充表中的数据,当我调试这段代码时,我发现它没有执行cellForRowAtIndexPath方法,但它正在调试numberOfRowsInSection和numberOfSectionsInTableView方法。

但有趣的是,当我在CouponWebsiteViewController.m上编写相同的代码(即在主视图上)时,它会填充表格中的数据。

关键是这段代码在主视图上工作正常,但它不适用于其他视图。

任何人都可以告诉我我缺少什么或者在主视图以外的其他视图上填充UITable。

先谢谢。 高拉夫

12 个答案:

答案 0 :(得分:9)

我不是积极的,但这里有一些想法。

  • 我认为当你将这个数组代码放在viewDidLoad中时,为时已晚。数据已经放入表格后执行ViewDidLoad。尝试将此代码放在initWithStyle方法或任何init方法中。或者您甚至可以将其置于ViewWillAppear方法中,但请务必遵循下一个建议。
  • 您可以尝试的另一件事是,只需在[self.tableView reloadData]方法的末尾调用viewDidLoad即可。虽然这不如第一个建议那么理想。

答案 1 :(得分:5)

您确定将类设置为表中的dataSource吗?要执行此操作,请在Interface Builder中控制并单击表视图,然后将其拖到占位符下的文件所有者。然后选择dataSource(也可能委托,具体取决于您的控制器视图设置)。

答案 2 :(得分:4)

我建议您确保表的大小需要显示行。

实际上,可能就是为什么没有调用方法cellForRowAtIndexPath,而应该调用numberOfRowsInSection

在这种情况下,你在桌子上看不到任何东西。

答案 3 :(得分:4)

对于遇到此问题的任何人,我通过使用以下方法将TableView的控制器作为子控件添加到父控制器来解决此问题:

UITableViewController * table = [[UITableViewController alloc] init];
...
[self.view addSubview:table.tableView];
[self addChildViewController:table];

答案 4 :(得分:3)

在viewWillAppear中初始化UITableView ...

答案 5 :(得分:3)

老问题,但我会插话。对于其他人。

为什么tableview没有更新并且没有调用cellForRowAtIndexPath:有很多原因。

如果您直接使用UITableViewController,则可能是“numberOfRowsInSection:”方法返回0

如果您在视图控制器中使用UItableView。您可能没有采用正确的协议并实施正确的方法 - 如果您使用的是xib或故事板,而您没有分配正确的委托,而数据源是另一个潜在的问题。

最后,如果你正在使用UITableViewController的子类,那么你可能没有覆盖其中一个默认方法,而且numberOfRowsInSection再次返回0。

答案 6 :(得分:1)

我在那里遇到了类似的问题。表视图委托和数据源设置正确,(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section也返回正数。但- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath永远不会被召唤。

我之前尝试过这些方法,但它也不起作用。最后,我注意到我忘记将表视图添加为视图控制器的子视图。在这之后,它就像一个魅力。

答案 7 :(得分:0)

您确定将表格视图设置为委托吗?

如果你有一个UITableViewController,你需要在viewDidLoad:

[self.tableView setDelegate:self];

如果您有其他类型的视图控制器,只需将UITableView设为IBOutlet,与tableViewDelegate和tableViewDataSource建立文件所有者的连接,然后在viewDidLoad中执行此操作:

[self.myTableProperty setDelegate:self];

如果View Controller不是UITableViewController,还要确保符合.h文件中的UITableViewDelegate和UITableViewDataSource协议

干杯

答案 8 :(得分:0)

如果可变数组或用于填充单元格内容的数组在头文件中设置为属性。 然后确保你总是使用

self.yourArray = [[NSMutableArray alloc] init];
[self.yourArray addObject:@"Object1"];

然后获取numberOfRowsInSection中的计数,您需要以下列方式访问它:

return [self.yourArray count];

这非常类似于用于引用实例变量的this指针。 当然,如果您已将UITableView的dataSource和委托设置为文件所有者,则还需要记住。您还在ViewController的头文件中包含了UITableViewDelegate和UITableViewDataSource。

我希望它可以帮到你。最好的运气。快乐的编码! 干杯!!

答案 9 :(得分:0)

好吧,我可以为这个问题为每个人添加一个简单点。我建议使用debug并确保:

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

不返回0.如果未实现此函数或返回0,则方法为:

cellForRowAtIndexPath:(NSIndexPath *)indexPath 
由于没有要显示的单元格,因此根本不会调用

答案 10 :(得分:0)

检查表视图是否已添加到视图中。如果没有,那么将触发其他表视图委托和数据源方法,但不会触发cellforrow:)

答案 11 :(得分:-1)

我在UITableView上也遇到了这个问题,我还设置了数据源并委托给了表视图,但是没有调用我的cellForRowAtIndexPath方法。

<强>解决方案:

  • 我的网络阻止了我的方法(使用防火墙)。我问我的网络管理员,我获得了对网络的完全访问权限,然后调用了我的cellForRowIndexPath方法。

  • 当我的回复来自网络服务时,由于网络阻止响应是黑色的,因此未调用cellForRowIndexPath方法。