ios 7 tableView didSelectRowAtIndexPath 在第一次选择时显示空白数据
Posted
技术标签:
【中文标题】ios 7 tableView didSelectRowAtIndexPath 在第一次选择时显示空白数据【英文标题】:ios 7 tableView didSelectRowAtIndexPath shows blank data on first selection 【发布时间】:2013-09-23 02:12:45 【问题描述】:我有一些为 ios 6 设计的应用程序,今天我将它们升级到 iOS 7。
它们是一个简单的表视图列表以及选择记录时,它会在另一个屏幕上显示有关该行的详细信息。这在 iOS 6 中完美运行。在 iOS 7 中,当我选择一行时,它会在 first 选择中显示一个空白数据页。如果我然后返回列表并重新选择该项目,它就会显示正确的数据。在第一次空白显示之后,它将适用于任何其他记录..
我绞尽脑汁,终生无法弄清楚为什么会发生这种情况。
有什么想法吗?
代码:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Statutes *statute = (Statutes *)[self.statutes objectAtIndex:indexPath.row];
if(self.detailView == nil)
DetailViewController *viewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
self.detailView = viewController;
[viewController release];
[self.navigationController pushViewController:self.detailView animated:YES];
self.detailView.title = [statute myStatute];
[self.detailView.statuteFullText setText:[statute myDescription]];
[self.detailView.statuteTitle setText:[statute myTitle]];
[self.detailView.favoritesID setText:[statute myPriority]];
[self.detailView.recordID setText:[statute myRecord]];
if ([@"1" isEqualToString:[statute myPriority]])
[self.detailView.favoriteControl setTitle:@"Remove from favorites"];
else
[self.detailView.favoriteControl setTitle:@"Add to favorites"];
此外,更改按钮标题添加到收藏夹等的部分不会在第一个项目选择时发生变化,它只是显示“项目”。
谢谢。
更新:
所以我把它缩小到这段代码:
if(self.detailView == nil)
DetailViewController *viewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
self.detailView = viewController;
[viewController release];
如果我删除 if 子句,那么每次选择都会发生这种情况。如果我注释掉整个代码,我将无法做出任何选择。所以我想我必须找到另一种方法来初始化我的视图控制器。有任何想法吗?为什么这在 iOS 6 中起作用呢?
【问题讨论】:
另一个注意:标题的设置每次都有效(即使在第一次选择时)。 @Lkabo您是否尝试在设置所有文本标签后在导航控制器上推送self.detailView
?
如果您调试第一次尝试执行的代码行。比较在第一次尝试和以后的尝试中执行的行。每次检查 detailView 的值。
@Amar 是的,结果相同。
@mobiletest 在第一次运行时,detailview 的值全部为零,然后在后续运行中填充它们..
【参考方案1】:
新答案:(2013 年 9 月 25 日)
我被后退的hack 所困扰,我必须这样做才能让它工作,而且当我从其他屏幕调用detailView 时,我遇到了一个类似的问题,这个hack 没有解决这个问题,所以我找到了另一个更简单的解决方法。 .
我所要做的就是将用于在异步标签和中提琴中设置相关视图值的命令包围起来!一切正常..
这是我的解决方案:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Statutes *statute = (Statutes *)[self.statutes objectAtIndex:indexPath.row];
if(self.detailView == nil)
DetailViewController *viewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
self.detailView = viewController;
[viewController release];
[self.navigationController pushViewController:self.detailView animated:YES];
dispatch_async(dispatch_get_main_queue(), ^
self.detailView.title = [statute myStatute];
[self.detailView.statuteFullText setText:[statute myDescription]];
[self.detailView.statuteTitle setText:[statute myTitle]];
[self.detailView.favoritesID setText:[statute myPriority]];
[self.detailView.recordID setText:[statute myRecord]];
if ([@"1" isEqualToString:[statute myPriority]])
[self.detailView.favoriteControl setTitle:@"Remove from favorites"];
else
[self.detailView.favoriteControl setTitle:@"Add to favorites"];
);
所以现在你可以看到
dispatch_async(dispatch_get_main_queue(), ^
围绕要在视图上设置的项目。我摆脱了 -ViewDidLoad 部分中所有多余的废话...
完美。
旧答案:(2013 年 9 月 24 日)
好吧,我让它工作了。这是一个完全倒退的黑客,但我是结果驱动的,所以我不在乎。这个功能已经改变并且需要这个 hack 但无论如何.. 我希望这对我确定可能会遇到这个问题的其他人有所帮助。
我把上面的代码单独留在了
- (void)viewDidLoad
部分我添加了以下代码:
DetailViewController *viewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
self.detailView = viewController;
[viewController release];
[self.navigationController pushViewController:self.detailView animated:YES];
dispatch_async(dispatch_get_main_queue(), ^
[self.navigationController popToRootViewControllerAnimated:NO];
);
它的作用是实例化 DetailViewController,显示它,然后弹出它。当应用程序加载时,它似乎在主屏幕上,正如预期的那样,并且在进行选择时,它现在第一次工作,因为从技术上讲这不是第一次......
-LK
【讨论】:
以上是关于ios 7 tableView didSelectRowAtIndexPath 在第一次选择时显示空白数据的主要内容,如果未能解决你的问题,请参考以下文章
Swift:使用 tableView DidSelect 方法更改单元格的 UIButton 图像