web-dev-qa-db-ja.com

iPhone UINavigationの問題-ネストされたプッシュアニメーションにより、ナビゲーションバーが破損する場合がある

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

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メソッドを使用することは重要ですか?

69
joshholat

私はそれを理解しました。どうやら、UITableViewDelegateの-didSelectRowAtIndexPathメソッドの外部から-pushViewControllerを呼び出すと、機能しません。その関数への呼び出しの移動は機能しました。奇妙な。

10
joshholat

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

118
S B

同じセグメントを2回トリガーコード内で1回、インターフェイスビルダーから1回、両方同時に...

私はあなたと同じエラーを受け取っていました。私の唯一の問題は、誤って同じセグエを2回発射していたことです。インターフェイスビルダーから1回、コード内から1回。

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

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

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

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

現在、Appleのドキュメントには、performSegueWithIdentifier:sender:参照の下に次のように記載されています。

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

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

したがって、インターフェイスビルダーから埋め込みコントロールを削除し、View Controller自体に貼り付けて、コードでセグエをトリガーします!

これで、二重セグエはもうありません!そして、これ以上のエラーはありません。

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

93
user1927446

私はあなたが今やったのと同じ問題/エラーメッセージがあり、解決策を探していて、このスレッドに行き着きましたが、私にとっては、解決策には実際にアニメーションが1つしかないことがわかりました:アニメーション化:最後のプッシュに対してのみYES)、これが役立つことを願って

乾杯。

12
code007

ペン先のボタンが2つの異なるアクションに接続されているために、同じ問題が発生しました。両方のView Controllerをロードしようとしたため、スタックが破損しました。

8
TigerCoding

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

古いプッシュでアクションが実行される前に新しいView Controllerをプッシュする場合、この種のエラーが発生します。そのため、特定のコードをinitに入れて早めに処理すると、間違いなくエラーが報告されます。

InitがView Controllerで実行されている時点では、ビューはまだロードされていません!

4
occulus

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

2
N1234

同じ問題に遭遇しました。私の場合、switchステートメントの区切りが欠落していたため、2つのセグエが同時に解雇されました。私のための簡単な修正。

1
salilathalye

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

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

1
Vito Andolini

最近、私は同じ問題に直面しました。その理由は次のとおりです。-View Controllerを誤って2回ポップしようとしていました。このクラッシュは、プッシュおよびポップビューコントローラーにブレークポイントを設定することで確認できます。

1
Baljeet Singh

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

これは、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スタックを変更しないでください。

1
stackOverFlew

1)パラメータでinitメソッドを使用するのではなく、UIViewControllerをプッシュする前に、必要な変数をプロパティとして渡すことを試みることができます。ほとんどの場合、これらのパラメーターはinitメソッドを超えて必要になります。

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

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

0
Mundi

これは私のUIControlEventsが原因で起こっていました

    [button addTarget:self action:@selector(callSecondView) forControlEvents:UIControlEventAllTouchEvents];

UIControlEventAllTouchEventsUIControlEventTouchUpInsideに変更しなければなりませんでしたが、UIButton呼び出しが原因で問題が発生した場合は、ボタンを機能させる必要があります。

0
John Riselvato

私はこれが答えられたことを知っていますが、他の人を助けることができます。

私も同じ問題を抱えていましたが、情報ボタンに悪いイベントを使用していたことが原因でした。 「UIControlEventAllTouchEvents」を使用していましたが、これにより、同じビューの2つのPushがNavigation Controllerに生成されました。正しいイベントは「UIControlEventTouchUpInside」でした。私はiOSが初めてです。

0
Carlos B

私のソリューションは

[self performSelector:@selector(moveTo)withObject:nil afterDelay:0.5];

0
Ponja

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

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

 [self.navigationController popViewControllerAnimated:YES];

現在のビューのViewWillDisappearで同時に。削除するだけで正常に機能します。

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

ビュー2にあり、ビュー3に移動したかった。その場合、このエラーが発生した。

0
Jasmeet

このエラーメッセージも表示され、ナビゲーションバーとNavigation Controllerの遷移は奇妙でした。私のセットアップは、Tabバーコントローラーに組み込まれた多数のNavigationコントローラーでした。問題は、viewDidLoadのTabバーコントローラー実装でsuper.viewDidLoad()を呼び出さなかったことです。

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

たぶん、これは他の誰かを助けることもできます!

0
empee

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

0
Kreutzer