ios 7 tableView didSelectRowAtIndexPath在第一次select时显示空白数据

我有一些为iOS 6devise的应用程序,今天我去升级到iOS 7。

它们是一个简单的表格视图列表,当select一条logging时,它会在另一个屏幕上显示有关该行的详细信息。 这在iOS 6中运行得非常完美。在iOS 7中,当我select一行时,它会在第一次select时显示一个空白数据页面 。 如果我然后回到列表并重新select该项目,然后显示正确的数据。 在第一个空白显示之后,对任何其他logging都可以正常工作

我正在绞尽脑汁,不能为我的生活弄清楚为什么会发生这种情况。

有任何想法吗?

码:

- (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"]; } } 

此外,改变button标题添加到collections夹等的部分,不会改变第一个项目select,它只是显示“项目”。

谢谢。

更新:

所以我缩小了这段代码:

  if(self.detailView == nil) { DetailViewController *viewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; self.detailView = viewController; [viewController release]; } 

如果我删除if子句,那么它发生在每一个select。 如果我注释掉整个代码,我不能做任何select。 所以我成像我必须find另一种方式来初始化我的视图控制器。 有任何想法吗? 为什么这个工作在iOS 6呢?

新答案:(9/25/13)

我被困扰的后退黑客,我不得不做的工作,再加上当我从其他屏幕调用detailView我遇到了一个类似的问题,这是不是由这个黑客修复,所以我发现了另一个更容易修复..

我所要做的只是围绕用于在asynchronous标记和中提琴内设置视图上的值的命令! 一切正常

这是我的解决scheme:

 - (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部分的所有额外的废话…

完善。

老解答:(9/24/13)

那么,我得到它的工作。 这是一个完全向后的黑客,但我是结果驱动,所以我不在乎。 它有一种令我不安的是,这个function已经改变,需要这个黑客,但是无论如何..我希望这可以帮助其他人,我肯定可能会遇到这个问题。

我把上面的代码单独留在了

 - (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,显示它,然后popup它。 当应用程序加载它似乎是在主屏幕上,如预期,并作出select时,现在工作在第一次,因为从技术上说,这不是第一时间…

-LK