4

私はXcode4.5と新しいiOS6機能を使用してセグエをほどきます。バーボタンアイテムからプログラムで表示されるポップオーバー内にナビゲーションビューコントローラーを表示しています。

- (IBAction)configChartTapped:(id)sender
{
    if (self.popover.isPopoverVisible) {

        [self.popover dismissPopoverAnimated:YES];

    } else {
        UINavigationController *chartConfigNavigationController = [self.storyboard instantiateViewControllerWithIdentifier:@"GrowthChartNavigationController"];

        ConfigChartTypeViewController *configChartTypeViewController = (ConfigChartTypeViewController*) chartConfigNavigationController.topViewController;

        self.popover = [[UIPopoverController alloc]initWithContentViewController:chartConfigNavigationController];
        self.popover.popoverContentSize = CGSizeMake(320, 500);
        self.popover.delegate = self;

        [self.popover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }
}

このメソッドの隣に、セグエをほどく(つまり、ポップオーバーを閉じる)ターゲットを定義しました...

- (IBAction)cancelConfig:(UIStoryboardSegue *)segue
{
    //
}

...そしてそれをナビゲーションビューコントローラーのナビゲーションバーのキャンセルボタンに接続しました。

キャンセルバーボタンをcancelConfigボタンに接続すると、Xcodeでは正常に機能しました。

ただし、コードを実行しているときは、Xcode 4.5がセグエをほどくときにポップオーバーを閉じることをサポートしているはずですが(リリースドキュメントによると)、[キャンセル]ボタンをクリックしても何も起こりません。

私は何を取りこぼしたか?

ありがとうございました!

4

1 に答える 1

5

アンワインド セグエは、正しいアンワインド メソッドが見つかるまで、セグエを介して提示されたビュー コントローラーのチェーンを上に移動するように親ビュー コントローラーに最初に要求することにより、ランタイム検索を使用します。ただし、ポップオーバーはポップオーバー セグエではなくプログラムで作成されているため、チェーンはありません。

親View Controllerに戻るセグエリンクがないため、コールバックは発生していません。アンワインド セグエは委任の抽象化された形式であるため、これはデリゲートの設定を忘れてコールバックを受信しないことに似ています。

解決策は、メソッドを使用してプログラムで作成するのではなく、Interface Builder でセグエを使用してポップオーバーを作成することconfigChartTapped:です。

手順:

最初に、提示ビュー コントローラのバー ボタン項目から提示ビュー コントローラにコントロール ドラッグしポップオーバーセグエを選択します。

ここに画像の説明を入力

表示中のビュー コントローラーでprepareForSegue:、ポップオーバー コントローラーへの参照を取得するように実装します。

- (void)prepareForSegue:(UIStoryboardPopoverSegue *)segue
                 sender:(id)sender {
    self.popover = segue.popoverController;
}

shouldPerformSegueWithIdentifier:次に、次のような表示/非表示の動作を復元するために実装しconfigChartTapped:ます。

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    if (self.popover.isPopoverVisible) {
        [self.popover dismissPopoverAnimated:YES];
        return NO;
    } else {
        return YES;
    }
}

最後に、Interface Builder で、提示されたビュー コントローラーの正しいポップオーバー コンテンツ サイズを設定します。

ここに画像の説明を入力

これにより、ポップオーバーからキャンセル ボタンをタップしたときに巻き戻すことができます。cancelConfig:また、ポップオーバーを表示するボタンをタップすると、ポップオーバーの表示/非表示を切り替えることができます。

于 2013-02-07T22:27:33.150 に答える