6

iOS 9 ベータ版の更新: Apple は iOS 9 でこれを修正した可能性があります。iOS 8 でこの問題を回避する場合は、iOS 9 でも正しく動作することを確認してください。

ストーリーボードでは、ポップオーバー プレゼンテーション セグエを作成して、ボタンからナビゲーションおよびビュー コントローラーを表示し、アンワインド セグエを作成しました。

縦向きでは、モーダル (フルスクリーン) プレゼンテーションは期待どおりに巻き戻されます/閉じられます。

横向きでは、アンワインド セグエも呼び出されますが、ポップオーバー プレゼンテーションは自動的に閉じられません。

私は何かを接続するのを逃しましたか?ポップオーバー プレゼンテーションを自分で閉じる必要がありますか?

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)__unused sender
{
    if ([[segue identifier] isEqualToString:@"showSelectBookChapter"])
    {
        UINavigationController *navigationController = segue.destinationViewController;

        if ([navigationController.topViewController isKindOfClass:[BIBLESelectViewController class]])
        {
            BIBLESelectViewController *selectViewController = (BIBLESelectViewController *)navigationController.topViewController;
            selectViewController.initialBookChapterVerse = self.bookChapterVerse;
        }
    }
}

- (IBAction)unwindToBIBLEChapterViewController:(UIStoryboardSegue *)segue
{
    if ([segue.identifier isEqualToString:@"unwindToBIBLEChapterViewController"]) {
        if ([segue.sourceViewController isKindOfClass:[BIBLESelectViewController class]])
        {
            BIBLESelectViewController *sourceViewController = (BIBLESelectViewController *)segue.sourceViewController;
            self.bookChapterVerse = sourceViewController.selectedBookChapterVerse;
            [self.tableView reloadData];

        }
    }
}

ストーリーボードのシーンとセグエ 更新: gabbler のサンプル コードを見た後、私は問題をシングル ビュー アプリケーションでは問題なくポップオーバーを閉じることに絞り込みましたが、マスター/詳細アプリケーションではそうではありませんでした。

更新 2: Luis が尋ねた質問への回答として、階層は次のようになります (簡単にするためにナビゲーション コントローラーは省略しています)。

  • スプリットビューコントローラー
    • マスター ビュー コントローラー
    • 詳細ビューコントローラー
      • チャプター ビュー コントローラー (モーダル ページ シート)
        • ビューコントローラーを選択します(チャプタービューコントローラーに巻き戻すが、閉じない問題のあるポップオーバー)

前回の更新で述べたように、新しいマスター/詳細テンプレートを作成し、詳細ビュー (のボタン) から直接ポップオーバーを表示しました。それは却下しません。

4

4 に答える 4

11

私もこの問題に遭遇しました。マスター ビュー コントローラー (UISplitViewController) からビュー コントローラーを (フォーム シートとして) モーダルに表示します。この問題は iPad でのみ発生しました (おそらく iPhone 6+ の横向きモードでも発生しましたが、私は確認していません)。私は(Swiftを使用して)巻き戻しアクションメソッドで次のことを行うことになりましたが、うまく機能します。

if !segue.sourceViewController.isBeingDismissed() {
    segue.sourceViewController.dismissViewControllerAnimated(true, completion: nil)
}
于 2015-03-01T11:51:55.003 に答える
1

これは popOver セグエの動作である/に違いありません。通常の状況または定期的に popOver が表示されている必要があります。セグエが重要な何かを示している場合、デバイスを回転させただけでその情報が失われたことが迷惑です。そのネイティブな振る舞いの理由です。したがって、自動的に却下したい場合は、自分でその動作を行う必要があります。これは機能します。

- (void)viewDidLoaddetailViewController.mのメソッドに次を追加します。

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter]
 addObserver:self selector:@selector(orientationChanged:)
 name:UIDeviceOrientationDidChangeNotification
 object:[UIDevice currentDevice]];

次に、このメソッドを作成します。

- (void) orientationChanged:(NSNotification *)note{
UIDevice * device = note.object;
//CGRect rect = [[self view] frame];
switch(device.orientation)
{
    default:
        [self dismissViewControllerAnimated:YES completion:nil];
    break;    }}

あなたは、単一のビューであなたが望むことが起こると言いましたが、私が popOvers を使用したときにその動作を見たことはありません。

于 2015-02-05T19:38:46.830 に答える
0

mbeaty の修正は素晴らしいですが、他の人が指摘しているように、このバグは iOS 9 で修正されることを知っているようで、ユニバーサル デバイス デザインでもうまく機能しません。私は両方の状況を処理するために彼の答えを適応させました。コードは次のとおりです。

@IBAction func yourUnwindSegue(segue: UIStoryboardSegue) {
    if #available(iOS 9, *) {
        return  // bug fixed in iOS 9, just return and let it work correctly
    }
    // do the fix for iOS 8 bug

    // access your SplitViewController somehow, this is one example
    let appDelegate  = UIApplication.sharedApplication().delegate as! AppDelegate
    let splitVC = appDelegate.window!.rootViewController as! YourSplitViewController

    // if the source isn't being dismissed and the splitView isn't
    //    collapsed (ie both windows are showing), do the hack to
    //    force it to dismiss
    if !segue.sourceViewController.isBeingDismissed() && splitVC.collapsed == false {
        segue.sourceViewController.dismissViewControllerAnimated(true, completion: nil)
    }
}

これは最初に iOS 9 が実行されているかどうかを確認し、バグが修正されたように見えるので終了します。これにより、複数のビューが却下される問題が回避されます。また、splitView が 2 つのウィンドウを表示している場合にのみこの修正が行われるようにするため (横向きの iPad および iPhone 6 Plus と将来のデバイスでのみ発生するようにするため)、折りたたまれていないことを確認するチェックを追加しました。

私はこれを徹底的にチェックしていませんが、うまくいくようです。また、私のアプリが iOS 7 の分に設定されているわけではありません。このバグが存在するかどうかはわかりません。iOS 8 未満をサポートしている場合は、それを調べる必要があるかもしれません。

于 2016-09-23T06:47:43.343 に答える