【发布时间】:2014-06-21 08:59:26
【问题描述】:
我知道这个问题已经被问过很多次了,但不幸的是,这些问题中的解决方案都不适合我。
以下是我尝试过的一些事情:
-
确保
numberOfSectionsInTableView没有返回 0 -
确保
numberOfRowsInSection没有返回 0。 -
使用
performSelectorOnMainThread确保在main thread上调用reloadData,如下所示:[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO] -
在viewDidLoad中设置delegate,如下图:
- (void)viewDidLoad { [超级视图DidLoad]; // ..... self.tableView.dataSource = 自我; self.tableView.delegate = self; }
我正在创建一个跟踪事件的 iOS 应用。该应用程序的主视图是嵌入到 UINavigationController 中的 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 将导致“list 3”的 UITableViewController 显示哪个不好,因为“list 3”不再存储在我用来存储数据的核心数据中。
如果你有什么想法,请告诉我。
谢谢
【问题讨论】:
-
numberOfSectionsInTableView,numberOfRowsInSection 是否调用?
-
尝试在 viewDidAppear 中重新加载 tableview:..
-
是的,numberOfSectionsInTableView 和 numberOfRowsInSection 被调用,它们都返回一个大于 0 的数字。我也试过 reload tableview in view 确实出现了,还是不行。
-
你采用
UITableViewDelegate协议了吗?不应该有问题......但也许但是。
标签: ios objective-c uitableview reload