68

次のエラーが発生し続けます。

2011-04-02 14:55:23.350 AppName[42430:207] nested push animation can result in corrupted navigation bar
2011-04-02 14:55:23.352 AppName[42430:207] nested push animation can result in corrupted navigation bar
2011-04-02 14:55:23.729 AppName[42430:207] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
2011-04-02 14:55:23.729 AppName[42430:207] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

これが私がやっていることです。View Controller から、特定のボタンが押されたときに次を呼び出します。

EventsViewController *viewController = [[EventsViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
navController.navigationBar.tintColor = [UIColor blackColor];
[self presentModalViewController:navController animated:YES];
[viewController release];
[navController release];

次に、EventsController で特定のボタンが押された場合、次のように呼び出します。

SingleEventViewController *viewController = [[SingleEventViewController alloc] initWithEvent:[currentEvents objectAtIndex:indexPath.row]];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];

次に、SingleEventViewController で特定のボタンが押された場合、次のように呼び出します。

EventMapView* viewController = [[EventMapView alloc] initWithCoordinates];
[[self navigationController] pushViewController:viewController animated:YES];
[viewController release];

そうです、ネストされたプッシュ アニメーションがあることは明らかですが、これは正しい方法ではないでしょうか? Apple の DrillDownSave コードを調べたところ、これが彼らのやり方のようです。viewDidLoad メソッドの代わりに init メソッドを使用しても問題はありませんか?

4

20 に答える 20

119

pushViewController前に呼び出すviewDidAppearのは安全ではありません。

于 2011-07-13T06:54:50.097 に答える
92

誤って同じセグエを2回トリガー するコード内で1回、Interface Builderから1回、ただし両方同時に...

私はあなたの他の人と同じエラーを受け取っていました。私の唯一の問題は、同じセグエを誤って2回発射していたことでした。1回はInterfaceBuilderから、もう1回は私のコード内から。

UITableViewがあります。セルが選択されると、InterfaceBuilderのセグエが起動します。ここに私の問題があります。インターフェイスビルダー内のCELLITSELfをクリックして直接起動するようにセグエを設定しました。次に、私のコードでは、didSelectRowAtIndexPathの下に、同じセグエを起動するコードがありました...そのように...

[self performSegueWithIdentifier:@"MySegue" sender:tableView];

つまり、行が選択されたためにdidSelectRowAtIndexPathが呼び出されると、上記のコード行でセグエが起動されます。次に、インターフェイスビルダーは、インターフェイスビルダーのセルオブジェクトに直接接続されているため、セグエもトリガーします。インターフェイスビルダーがセグエを直接起動するのを停止します。セル自体から外れるように内側にネストするのではなく、ViewControllerの上部からセグエを接続する必要があります。

したがって、私と同じ理由でこの問題が発生している場合、つまり同じセグエを2回呼び出している場合は、CELLからセグエへの接続を直接解除し、セグエ接続をセル内にネストされるのではなく、IBのテーブル階層の最上位。ViewController自体からのセグエをセグエに接続します。これを正しく行った場合、セグエを選択すると、セルだけでなく、それが由来するビュー全体が強調表示されます。

現在、Appleのドキュメントには、performSegueWithIdentifier:sender:reference:

通常、アプリはセグエを直接トリガーする必要はありません。代わりに、ビュー階層に埋め込まれたコントロールなど、ViewControllerに関連付けられたInterfaceBuilderでオブジェクトを構成して、セグエをトリガーします。ただし、おそらくストーリーボードリソースファイルで指定できないアクションに応答して、このメソッドを呼び出してプログラムでセグエをトリガーすることができます。たとえば、シェイクまたは加速度計のイベントを処理するために使用されるカスタムアクションハンドラーから呼び出すことができます。

私の場合、UITableViewの検索ボタンがあり、検索結果テーブルが存在するときにセグエが呼び出されるか、通常のテーブルビューが存在するかを判断する必要がありました。そのため、セグエを直接トリガーする必要がありました。

したがって、埋め込みコントロールをInterface Builderから削除し、View Controller自体に貼り付けてから、コードでセグエをトリガーします。

今、これ以上のダブルセグエはありません!そして、これ以上のエラーはありません。

それがお役に立てば幸いです。これに取り組むのに数時間かかりました。

于 2013-01-19T10:13:45.073 に答える
13

私はあなたが今したのと同じ問題/エラーメッセージを抱えていて、解決策を探していて、このスレッドにたどり着きましたが、私にとっては、ネストされたプッシュを実行するときに、解決策が実際に1つだけアニメートされていることがわかりました:YES (私はput animation:YES 最後のプッシュのみ)、これが役立つことを願っています

乾杯。

于 2011-04-11T05:02:28.957 に答える
9

私はそれを理解しました。UITableViewDelegate の -didSelectRowAtIndexPath メソッドの外から -pushViewController を呼び出すと、どうやら機能しません。呼び出しをその関数に移動するとうまくいきました。変。

于 2011-04-09T19:51:32.357 に答える
8

私は、ペン先のボタンが2つの異なるアクションに接続されていることに起因するこの同じ問題に遭遇しました。両方のViewControllerをロードしようとしたため、スタックが破損しました。

于 2012-02-20T03:42:06.337 に答える
4

viewDidLoad メソッドの代わりに init メソッドを使用するとはどういう意味ですか?

古いプッシュが実行される可能性が低くなる前に新しいView Controllerをプッシュすると、この種のエラーが発生します。そのため、特定のコードを init に入れて時期尚早に実行すると、エラーが報告される可能性があります。

ビュー コントローラで init が実行されている時点では、ビューはまだロードされていません。

于 2011-04-03T00:32:15.300 に答える
2

うーん、私はこの問題を抱えていました.iOS開発シーン全体に不慣れです。しかし、インターフェイスビルダーで接続インスペクター (ファイルの所有者) を見た後、ボタンをコピーしたときに、以前のボタンメソッドと作成した新しいメソッドが割り当てられていることがわかりました。私の問題のネストされた側面がどこから来たのかと思います.2つの異なるメソッドを実行していたため、どちらもビューをNav Controllerにプッシュしていました。これはすでに回答されていることは知っていますが、他の誰かが私のようなばかげた間違いを犯した場合に備えて、これを掲載すると思いました.

于 2013-10-02T14:57:26.307 に答える
1

私の問題は、キーボードがアクティブになっていることに関係していました。

これは、textField のデリゲート メソッドから ViewController をプッシュしたことが原因でした。

-(void)textFieldDidBeginEditing:(UITextField *)textField{

        FilterLocationViewController *destViewController = (FilterLocationViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"FilterLocationViewController"];

        [self.navigationController pushViewController:destViewController animated:YES];

}

コードを次のように変更すると:

-(void)textFieldDidBeginEditing:(UITextField *)textField{

        [_textFieldLocation resignFirstResponder]; //adding this line

        FilterLocationViewController *destViewController = (FilterLocationViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"FilterLocationViewController"];

        [self.navigationController pushViewController:destViewController animated:YES];

}

(行を追加 [textField resignFirstResponder];)問題は解決しました。

基本的に教訓は、キーボードが外れている場合は、navigationController スタックを変更すべきではないということです。

于 2014-04-02T02:49:17.510 に答える
1

これはすでに回答されていますが、テーブルビューを使用せずに同じエラーが発生したため、これは他の人に役立つと思いました。私はついに問題を理解しました。

IBAction が pushViewController を呼び出す既存のボタンがありました。既存のボタンをコピーして新しいボタンを作成しました。新しいボタンには、pushViewController を呼び出すアクションもありました。新しいボタンがタップされて (内部がタッチアップされ)、View Controller が押されたときに、このエラーが発生しました。新しいボタンを削除し、ゼロから作成し、既存のアウトレットとアクションにバインドすると、エラーはなくなりました。

于 2012-07-17T00:21:41.963 に答える
0

私の場合、ストーリーボードとプログラムの両方でプッシュ セグエを設定していました。うまくいけば、それは誰にも役立つでしょう

于 2014-08-20T02:40:34.643 に答える
0

I know that this was answered, but it could help others.

I had the same problem, but it was caused because I was using a bad event for an info button. I was using "UIControlEventAllTouchEvents" and this generated two push of the same view into the navigation controller. The correct event was "UIControlEventTouchUpInside". I'm new to iOS.

于 2014-12-05T12:05:23.780 に答える
0

このエラー メッセージも表示され、ナビゲーション バーとナビゲーション コントローラーの遷移が変でした。私のセットアップは、タブ バー コントローラーに埋め込まれた一連のナビゲーション コントローラーでした。super.viewDidLoad()問題は、Tab bar Controller の実装で を呼び出さなかったことですviewDidLoad

super の呼び出しは、viewDidLoad をオーバーライドするときに行うべきことをドキュメントが明確に指摘しているものであり、私はこれを難しい方法で学びました。

多分これは他の誰かを助けることができます!

于 2014-10-09T14:11:50.077 に答える
0

他人のことは知らない。StoryBoard を使用しているほとんどの人は、このような問題に直面していると思います。私はXIBを使用しています。

私の場合、問題は、プッシュを使用して別のビューに移動しているときに、使用していたことでした

 [self.navigationController popViewControllerAnimated:YES];

同時に現在のビューの ViewWillDisappear で。削除するだけで問題なく動作します。

要件とフローのために、POP を使用していました。階層は 1 -> 2 ->3 でした

私はビュー 2 にいて、ビュー 3 に移動したかったのです。その場合、このエラーが発生しました。

于 2014-05-19T10:55:18.880 に答える
0

UIViewController1) おそらく、パラメーターで init メソッドを使用するのではなく、プッシュする前に必要な変数をプロパティとして渡してみることができます。いずれにせよ、init メソッドを超えてこれらのパラメータが必要になる可能性が最も高いでしょう。

また、initWithCoordinates:メソッドにはパラメーターがありません。おそらく、カスタムの init メソッドが問題の一部です。

2)あなたが言及したからといってviewDidLoad、このメソッドはビューがロードされた後の初期化用です。コードで UIViewController を作成する場合は、サブビューloadViewを設定するために使用する必要があります。

于 2011-04-03T01:55:01.030 に答える