web-dev-qa-db-ja.com

SwiftでView Controllerを提示し、それを却下し、別のものを提示します

そのため、ユーザーがボタンを押すと別のView Controllerが表示されるボタンを持つルートView Controllerがあります。この2番目のコントローラーには、ルートビューコントローラーに戻るだけの閉じるオプションと、ユーザーがタッチすると現在のビューコントローラーを閉じるボタンがあり、1秒間ルートビューコントローラーに戻り、別のビューコントローラーを表示します。私が使用する最初のコントローラーに移動します:

let vc = FirstController()
self.present(vc, animated: true, completion: nil)

そして、他のView Controllerで私がこれをやめるだけのボタンを選択するとき。

self.dismiss(animated: true, completion: nil)

したがって、別のコントローラーを閉じて表示する必要がある2番目のコントローラーについては、次のことを試しました。

self.dismiss(animated: true, completion: {
            let vc = SecondController()
            self.present(vc, animated: true, completion: nil)
        })

しかし、エラーが発生します:

Warning: Attempt to present <UINavigationController: 0xa40c790> on <IIViewDeckController: 0xa843000> whose view is not in the window hierarchy!
13
ravelinx

FirstControllerを閉じた後にFirstControllerからSecondControllerを表示しようとしているため、エラーが発生します。これは機能しません:

self.dismiss(animated: true, completion: {
    let vc = SecondController()

    // 'self' refers to FirstController, but you have just dismissed
    //  FirstController! It's no longer in the view hierarchy!
    self.present(vc, animated: true, completion: nil)
})

この問題は、昨日の質問I answered に非常によく似ています。

シナリオに合わせて変更しました。これをお勧めします。

weak var pvc = self.presentingViewController

self.dismiss(animated: true, completion: {
    let vc = SecondController()
    pvc?.present(vc, animated: true, completion: nil)
})
40
Mike Taverne