0

我有一些为 iOS 6 设计的应用程序,今天我将它们升级到 iOS 7。

They are a simple table view lists and when a record is selected it displays details about that row on another screen. 这在 iOS 6 中完美运行。在 iOS 7 中,当我选择一行时,它会在第一次选择时显示一个空白数据页。如果我然后返回列表并重新选择该项目,然后它会显示正确的数据..在第一次空白显示之后,它将适用于任何其他记录..

我绞尽脑汁,终生无法弄清楚为什么会这样。

有任何想法吗?

代码:

- (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 中起作用呢?

4

1 回答 1

3

新答案:(2013 年 9 月 25 日)

我为让它工作而必须做的向后黑客攻击感到困扰,另外,当我从其他屏幕调用 detailView 时,我遇到了一个类似的问题,这个黑客没有解决这个问题,所以我找到了另一个更简单的解决方法..

我所要做的就是将用于在异步标签和中提琴中设置相关视图值的命令包围起来!一切正常..

这是我的解决方案:

- (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

于 2013-09-24T19:48:29.450 回答