1つのViewControllerにアイテムのリストがあります。アイテムを選択すると、詳細ビューコントローラが押されて、選択したアイテムの詳細が表示されます。次に、(ナビゲーションバーから)編集ボタンを選択すると、編集ビューコントローラーが押されてアイテムの詳細を編集できるようになります。キャンセルや元に戻すなど、これはすべて機能しています。
最初のリストビューコントローラーには、(ナビゲーションバーに)追加ボタンもあり、新しいレコードを追加できます。(これはコアデータを使用していますが、私の質問とは関係がないと思います。)アイテムの空白のレコードを作成することからテストを開始しました。詳細ビューコントローラーが表示されると、すべてのフィールドが空白になります。次に、編集ボタンを選択して、すでに入力されているレコードであるかのように詳細を編集できます。これも機能します。
私がやろうとしているのは、追加ボタンを選択し、詳細ビューコントローラを押してから、すぐに編集ビューコントローラを押すことです。これを実行する理由は、編集ビューコントローラーをポップすると、詳細ビューコントローラーが表示されるようにするためです。(その後、リストビューコントローラーに戻るか、編集ビューコントローラーに再度プッシュできます。)
私はこれに問題があります。
次のように、リストビューコントローラで2回プッシュしてみました。
- (void) add {
clientInfoTVC.clientMO = [self createNewClient];
[self.navigationController pushViewController:clientInfoTVC animated:YES];
[self.navigationController pushViewController:clientInfoTVC.clientEditTVC animated:YES];
}
ここで、clientInfoTVC.clientEditTVCはeidtビューコントローラーを指します。これはSIGABRTでエラーになり、追加しようとすると停止します。
次に、追加が選択されているときに、詳細ビューコントローラのviewWillAppearで最初のプッシュを実行し、次に2回目のプッシュを実行する前に、詳細ビューコントローラでフラグプロパティ値を設定してみました。これはエラーになります。2番目のプッシュを詳細ビューコントローラーのviewDidAppearに移動してみましたが、同じ結果になりました。
私はこれで迷子になります。ナビゲーションスタックを維持して中央のViewControllerに戻ることができるように、誰かが1つのViewControllerを2番目のViewControllerにプッシュする方法を教えてもらえますか?
@ljkyserは答えの一部にヒットしました。しかし、ビューをスタックにプッシュするだけでは、そのinit、viewWillAppear、およびviewDidLoadを実行できないこともわかりました。これはすべてメインスレッドで行われているため、ビューをプッシュすると、そのビューコントローラーが実行ループにキューイングされるだけだと思います。2番目のViewControllerを押すと、最初のView Controllerが実行ループから削除され、2番目のViewControllerが実行ループキューに入れられます。たぶん誰かがそれを確認して、私がやったよりも正確にそれを説明することができます。
いずれにせよ、エディットビューコントローラーを正しく初期化するには、ポインターを渡して、操作している管理対象オブジェクトを見つける必要がありました。私は元々、詳細ビューコントローラ内から編集ビューコントローラをインスタンス化していました。したがって、元のコードでは、まだインスタンス化されていないViewControllerをプッシュしていました。安全のために、リストビューコントローラーからインスタンス化し、次のようにダブルプッシュを実行する前に、すべての管理対象オブジェクトポインターが設定されていることを確認しました。
- (void) add {
Client *clientNew = [[NSEntityDescription alloc] init];
clientNew = [self createNewClient];
clientInfoTVC.clientMO = clientNew;
clientEditTVC.clientMO = clientNew;
[clientNew release];
[self.navigationController pushViewController:clientInfoTVC animated:NO];
[self.navigationController pushViewController:clientEditTVC animated:YES];
}
@ljkyserからの回答を確認し、最初のアニメーションを維持しながらこれらの変更を試しました:YES。これにより、ナビゲーションバーは正しく見えましたが、ビューの残りの部分は同期していませんでした。アニメーションの設定:NOはその問題を修正しました。