3

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はその問題を修正しました。

4

1 に答える 1

4

コードを次のように変更してみてください。

- (void) add {
    clientInfoTVC.clientMO = [self createNewClient];
    [self.navigationController pushViewController:clientInfoTVC animated:NO]; 
    [self.navigationController pushViewController:clientInfoTVC.clientEditTVC animated:YES];
}

最初のpushViewControllerアニメーションパラメータをNOに設定します。

このSOの質問に似ています:複数のビューコントローラーをナビゲーションコントローラースタックにプッシュする際の問題

他のオプションもあります。必要に応じて、特定のビューコントローラにプッシュアンドポップするか(UINavigationControllerリファレンス)、UINavigationControllerスタックを直接編集できます(ここを参照)。

于 2011-04-27T05:31:34.403 に答える