我知道这个问题被问了很多次,但不幸的是,这些问题的解决方案都没有为我工作。
以下是我尝试过的一些事情:
numberOfSectionsInTableView
未返回0 numberOfRowsInSection
没有返回0。确保reloadData
使用main thread
调用performSelectorOnMainThread
,如下所示:
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]
在viewDidLoad中设置委托,如下所示:
我正在创建一个跟踪事件的iOS应用。该应用程序的主视图是UITableViewController
(调用它的主列表),它嵌入UINavigationController
中,嵌入UITabViewController
。用户可以创建列表或事件的两个对象。当创建新列表并从当前UITableViewController
中选择时,新的UITableViewController将被推送到同一UINavigationController
。
每个列表(UITableViewController
)都有一个编辑按钮,允许用户删除列表。
假设用户选择删除"列表3"属于主列表,即有3个视图控制器被推送到UINavigationController:
UITableViewController
主列表UITableViewController
用于所选列表"列表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将导致UITableViewController用于" list 3"显示哪个是坏的,"列表3"我不再存储在用于存储数据的核心数据中。
如果你知道该怎么做,请告诉我。
由于
答案 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:
原因: