2

場所のリストを表示するアプリに取り組んでいます。NavigationController があり、ナビゲーション バーにはいくつかの UIBarButtonItem (左右) があり、中央のセクションはラベルと 2 つの UIButton を持つカスタム ビューです。

ツールバー

マップ ボタンは、マップ上にポイントを表示する MapViewController へのセグエを実行します。私が達成したいのは、マップ ViewController のナビゲーション バーにも同じカスタム UIView (矢印ボタンと Day Label を表示) が表示されることですが、これを達成する方法がわかりません。prepareForSegue のビューをコピーしようとしました:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([segue.identifier isEqualToString:@"FlipFromListToMap"]) {
        if ([segue.destinationViewController isKindOfClass:[DisplayTourMapViewController class]]){
            DisplayTourMapViewController *cityListController = segue.destinationViewController;
cityListController.navigationItem.titleView = self.navigationItem.titleView;
        }
    }
}

しかし、これは機能していません。さらに、元のテーブル ビューからナビゲーション ビューに戻ると、次のようになります。

なくなった

私のアプローチが間違っているかどうか知りたいです。セグエ間でナビゲーションコントローラーのビューを保持できますか? ナビゲーションコントローラーとセグエを使用しても大丈夫ですか? または、コントローラー内に 2 つのビューを用意して、プログラムで交換する必要がありますか? 2 つのビューのモデルは同じで、情報を表示する方法 (マップまたはリスト) のみが異なります。

前もって感謝します。

4

3 に答える 3

1

最初のナビゲーション コントローラーに戻ったときにタイトル ビューが表示されないのは、そのスーパービューを変更したためです。各ビューはスーパービューを 1 つしか持つことができず、そのスーパービューを次のビュー コントローラーのビューに移動しました。

しかし、2番目のView Controllerにまったく表示されない理由がわかりません。あなたとまったく同じコードでサンプルアプリを作成したところ、次のビューコントローラーは最初のタイトルビューを表示します。しかし、元に戻ると、最初のものにはタイトル ビューがありません。最初のコントローラーのプロパティ内にタイトル ビューを保存し、viewWill/DidAppear で再度設定することで、この問題を回避しようとしました。nil でない場合は、アニメーション中にタイトル ビューを表示してから削除します。

これはすべて意図した動作とは思えないので、さらにテストを行い、バグを報告します (または、より良い回答を返します)。同じことをすることをお勧めします。

于 2012-07-05T12:35:02.170 に答える
0

私は同じ問題を抱えていました: プッシュは titleView アイテムで正しく動作しますが、ナビゲーション アニメーションが終了するとポップが消えてしまいます。ほぼすべての組み合わせを試しましたが、これが最終的に機能したものです。

1)ナビゲーションコントローラーのデリゲート(それ自体に設定しました)に、次を挿入しました:

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    viewController.navigationItem.titleView = self.myCustomView;
}

2)次に、個々のView Controller(3つありました)に、次を挿入しました:

- (void)viewWillDisappear:(BOOL)animated
{
    self.navigationItem.titleView = nil;
}

これらの特定のコールバック メソッドを使用することは非常に重要です。willShowViewController:最初と/または2番目に使用したときはまったく機能しませんでしたviewDidDisappear:

a で実行しようとする際の問題prepareForSegue:は、プッシュ方向でしか機能しないことです。destinationViewControllerただし、それ自体のおよびsourceViewControllerフィールドで、両方のコントローラーにアクセスできますsegue。しかし、それを逆方向に機能させるには、同じコードをunwind segue. 私の解決策はおそらく最も簡単だと思います(特に、navコントローラーが管理するすべてのView Controllerに対してそれを実行したいので)。

于 2013-06-29T17:12:55.360 に答える
-1

わかりました、私はついにそれを理解しました。この種の動作を実装する最善の方法は、ViewController 間のセグエを使用しないことだと思います。両方のビューは同じデータを表示する方法が異なるため、2 つのビュー (リストとマップ) を持つコントローラーを実装し、ボタンを使用して、Apple 開発者ライブラリでコメントされているようにビューを切り替えるアクションを実行します。

- (IBAction)toggleMainViews:(id)sender {
    [UIView transitionFromView:(displayingPrimary ? primaryView : secondaryView)
        toView:(displayingPrimary ? secondaryView : primaryView)
        duration:1.0
        options:(displayingPrimary ? UIViewAnimationOptionTransitionFlipFromRight :
                    UIViewAnimationOptionTransitionFlipFromLeft)
        completion:^(BOOL finished) {
            if (finished) {
                displayingPrimary = !displayingPrimary;
            }
    }];
}

アニメーション Apple Developer Library

このアプローチを使用して、viewController を変更しないので、ナビゲーション バーは同じままで、必要に応じてボタンを保持できます。

于 2012-07-06T06:58:42.400 に答える