..これであなたを置き換える、:) _メソッドshowMessageForUser(だ魔法のように動作します。戻るボタンを正しく動作させるために特別な操作を行う必要はありません。ナビゲーションコントローラは、viewControllers
アレイ(2番目のアイテムがある場合)の2番目のアイテムに基づいて戻るボタンを設定し、viewControllers
アレイを更新するたびに戻るボタンを更新します。
これはどうやってやるの?最初に、UIViewController
にメソッドを追加して、それが特定のuserId
のビューコントローラであるかどうかを確認します。ほとんどのビューコントローラは正しいビューコントローラではありません(とすることはできません)ので、それだけでfalse
を返します。
extension UIViewController {
func isViewControllerForUserId(userId: Int) -> Bool {
return false
}
}
その後、我々は適切なときにtrue
を返すためにMessagesViewController
でこのメソッドをオーバーライド:今すぐ
extension MessagesViewController {
override func isViewControllerForUserId(userId: Int) -> Bool {
return self.userId == userId
}
}
、特定のユーザのビューコントローラを表示するために、ナビゲーションコントローラのスタックで既存のビューコントローラを検索します。我々は、
private func pushNewViewControllerForUserId(userId: Int) {
let vc = self.storyboard?.instantiateViewControllerWithIdentifier("MessagesViewController") as! MessagesViewController
vc.userId = userId
self.navController.pushViewController(vc, animated: true)
}
我々はそれを見つけた場合は:私たちは新しいビューコントローラを作成し、それを押して、それを見つけていない場合は
func showMessageForUserId(userId: Int) {
if let index = navController.viewControllers.indexOf({ $0.isViewControllerForUserId(userId) }) {
navController.moveToTopOfNavigationStack(viewControllerAtIndex: index)
} else {
pushNewViewControllerForUserId(userId)
}
}
:私たちが取る行動は、我々はそれを見つけるかどうかに依存しますただ、私は自分自身のUINavigationControllerを作成したいについて推論するためのコードを容易にするために
extension UINavigationController {
func moveToTopOfNavigationStack(viewControllerAtIndex index: Int) {
var stack = viewControllers
if index == stack.count - 1 {
// nothing to do because it's already on top
return
}
let vc = stack.removeAtIndex(index)
if (reorderingIsBuggy) {
setViewControllers(stack, animated: false)
}
stack.append(vc)
setViewControllers(stack, animated: true)
}
private var reorderingIsBuggy: Bool {
// As of iOS 9.3 beta 3, `UINavigationController` drops the prior top-of-stack
// when you use `setViewControllers(_:animated:)` to move a lower item to the
// top with animation. The workaround is to remove the lower item from the stack
// without animation, then add it to the top of the stack with animation. This
// makes it display a push animation instead of a pop animation and avoids
// dropping the prior top-of-stack.
return true
}
}
おかげでロブを。私はインデックスでそれを削除して追加した後にスタックを印刷しました。それは正しい順序で印刷されているので、上手く見えます。'' 'setViewControllers'''を呼び出すと、すべてがうまくいくように見えて、望むVCが上に表示されます。しかし、VCが "脱"して消える前のVC。前のVCが消えた理由を知っていますか? (私は2つのVCだけをテストしています) – TIMEX
注:この行を変更しました: '' 'navController.setViewControllers(stack、animated:false)' ''をアニメーション化:falseにして、すべてうまくいくようです。この変更を行うことが問題を解決する理由は何ですか? – TIMEX
どのビューコントローラが 'deinit'を実行していますか? –