0

iOS 6 用に設計されたアプリがいくつかあり、今日はそれらを iOS 7 にアップグレードしました。

これらは単純なテーブル ビュー リストであり、レコードを選択すると、その行に関する詳細が別の画面に表示されます。これは 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 句を削除すると、すべての選択で発生します。コード全体をコメントアウトすると、何も選択できなくなります。だから私は、View Controllerを初期化する別の方法を見つけなければならないことを想像しています。何か案は?なぜこれが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 日)

さて、私はそれを働かせました。これは完全な後方ハックですが、私は結果重視なので気にしません。この機能が変更され、このハックが必要になったことに少し腹を立てていますが、何でも..これが、これに遭遇している可能性があると確信している他の人に役立つことを願っています.

上記のコードをそのままにして、

- (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 に答える