iOS - 在reloadData上未调用cellForRowAtIndexPath

时间:2014-05-05 06:17:57

标签: ios objective-c uitableview reload

我知道这个问题被问了很多次,但不幸的是,这些问题的解决方案都没有为我工作。

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

  1. 确保numberOfSectionsInTableView未返回0
  2. 确保numberOfRowsInSection没有返回0。
  3. 确保reloadData使用main thread调用performSelectorOnMainThread,如下所示:

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

  4. 在viewDidLoad中设置委托,如下所示:

    • (void)viewDidLoad { [super viewDidLoad]; // ..... self.tableView.dataSource = self; self.tableView.delegate = self; }
  5. 我正在创建一个跟踪事件的iOS应用。该应用程序的主视图是UITableViewController(调用它的主列表),它嵌入UINavigationController中,嵌入UITabViewController。用户可以创建列表或事件的两个对象。当创建新列表并从当前UITableViewController中选择时,新的UITableViewController将被推送到同一UINavigationController

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

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

    1. UITableViewController主列表
    2. UITableViewController用于所选列表"列表3"
    3. UITableViewController用于修改列表视图
    4. 点击删除按钮时,会显示警告。如果用户选择继续,则执行以下代码:

      - (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将导致UITableViewController用于" list 3"显示哪个是坏的,"列表3"我不再存储在用于存储数据的核心数据中。

      如果你知道该怎么做,请告诉我。

      由于

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

事实证明我正在使用可视格式的自动布局。 似乎UITableView和NSLayoutContraint不能很好地协同工作。一旦我评论了应用约束的方法,就调用了cellForRowAtIndexPath并显示了tableview ...

答案 3 :(得分:0)

请将调试点放在此,

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

方法和log someValue值可能会返回0,这就是为什么不调用cellForRowAtIndexPath方法。

感谢。

答案 4 :(得分:0)

不知道对Avalerion的回答是谁,但他的陈述也很重要。

我有同样的问题,虽然满足以下条件,但未调用委托方法cellForRowAtIndexPath:

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

原因:

  • 我没有为表设置高度约束,因此它没有高度,因此即使调用了例如numberOfRowsInSection,app也没有调用cellForRowAtIndexPath。