【问题标题】:iOS - cellForRowAtIndexPath not called on reloadDataiOS - 未在 reloadData 上调用 cellForRowAtIndexPath
【发布时间】:2014-06-21 08:59:26
【问题描述】:

我知道这个问题已经被问过很多次了,但不幸的是,这些问题中的解决方案都不适合我。

以下是我尝试过的一些事情:

  1. 确保numberOfSectionsInTableView 没有返回 0

  2. 确保 numberOfRowsInSection 没有返回 0。

  3. 使用performSelectorOnMainThread 确保在main thread 上调用reloadData,如下所示:

    [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]

  4. 在viewDidLoad中设置delegate,如下图:

    • (void)viewDidLoad { [超级视图DidLoad]; // ..... self.tableView.dataSource = 自我; self.tableView.delegate = self; }

我正在创建一个跟踪事件的 iOS 应用。该应用程序的主视图是嵌入到 UINavigationController 中的 UITableViewController(称为主列表),而 UINavigationController 又嵌入到 UITabViewController 中。用户可以创建两个对象一个列表或一个事件。当从当前UITableViewController 中创建并选择一个新列表时,一个新的 UITableViewController 会被推送到同一个UINavigationController

每个列表 (UITableViewController) 都有一个允许用户删除列表的编辑按钮。

假设用户选择删除属于主列表的“列表3”,即有3个视图控制器推送到UINavigationController:

  1. UITableViewController 主列表
  2. UITableViewController 用于所选列表“列表 3”
  3. UITableViewController 用于编辑列表视图

点击删除按钮时,会显示警报。如果用户选择继续执行以下代码:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    // .....
        //here I'm calling unwind which is going to pop the UITableViewController
        //for the edit table view
        [self performSegueWithIdentifier:@"unwindFromDelete" sender:nil];
        //here I'm calling a method i wrote to pop the UITableViewController
        //of the deleted list (in this example "list 3")
        [self setNavigationControllerViewControllers];
    // .....
}

- (IBAction)unwindFromEditListToList:(UIStoryboardSegue *)segue {
    .....
}

- (void)setNavigationControllerViewControllers {
    NSMutableArray *viewControllers = [[self.navigationController viewControllers] mutableCopy];
    [viewControllers removeLastObject];
    [self.navigationController setViewControllers:viewControllers];
}

该代码执行后,主列表UITableViewController的viewWillAppear执行如下:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // ..... update the data
    [self.tableView reloadData];
}

[self.tableView reloadData] 将导致执行以下代码:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // .....
    return someValue; // Something greater than zero
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    // .....
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // .....
    return someValue; //Something greater than zero
}

#pragma warning "Not getting called"
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // .....
}

所有方法都已执行,但 cellForRowAtIndexPath 未执行。如果上面提到的 setNavigationControllerViewControllers 没有被调用,问题就消失了。不调用 setNavigationControllerViewControllers 将导致“list 3”的 UITableViewController 显示哪个不好,因为“list 3”不再存储在我用来存储数据的核心数据中。

如果你有什么想法,请告诉我。

谢谢

【问题讨论】:

  • numberOfSectionsInTableView,numberOfRowsInSection 是否调用?
  • 尝试在 viewDidAppear 中重新加载 tableview:..
  • 是的,numberOfSectionsInTableView 和 numberOfRowsInSection 被调用,它们都返回一个大于 0 的数字。我也试过 reload tableview in view 确实出现了,还是不行。
  • 你采用UITableViewDelegate协议了吗?不应该有问题......但也许但是。

标签: ios objective-c uitableview reload


【解决方案1】:

numberOfSectionsInTableView 必须至少返回 1。 请参阅下面的link

如果您不使用多个部分,甚至不需要覆盖它。

【讨论】:

    【解决方案2】:

    如果表格的高度是动态的。确保表格在视图中,可见且高度为 调用 reload 时至少 1px。

    【讨论】:

      【解决方案3】:

      我对此给出了答案,因为我一直在寻找解决方案一段时间,而这个问题与我问自己的问题最接近......

      事实证明,我使用的是具有视觉格式的自动布局。 似乎 UITableView 和 NSLayoutContraint 不能很好地配合使用。一旦我评论了应用约束的方法,就会调用 cellForRowAtIndexPath 并显示 tableview...

      【讨论】:

        【解决方案4】:

        请在此设置调试点,

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

        方法和记录 someValue 值可能返回 0,这就是不调用 cellForRowAtIndexPath 方法的原因。

        谢谢。

        【讨论】:

        • 正如我在问题的前几行中提到的,numberOfSectionsInTableView 都没有返回 0,而 numberOfRowsInSection 也没有返回 0。
        【解决方案5】:

        不知道谁对 Avalerion 的回答投了反对票,但他的声明也很重要。

        我遇到了同样的问题,虽然符合以下条件,但没有调用委托方法 cellForRowAtIndexPath:

        • 已设置委托和数据源
        • numberOfSectionsInTableView 方法返回 1
        • numberOfRowsInSection 返回了正确的数字并且数据可用。

        原因:

        • 我没有为表格设置高度限制,所以它没有高度,因此应用程序没有调用 cellForRowAtIndexPath,即使它调用了例如 numberOfRowsInSection。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多