web-dev-qa-db-ja.com

Swiftのナビゲーション戻るボタンからセグエをほどく

テーブルセルがあるという点で、設定画面があります。それをクリックすると、ユーザーがオプションを選択できる別の画面に移動し、戻るボタンが押されたときに前のビューコントローラーにそれを戻します。

image first view controllerimage second view controller

カスタムバーボタンアイテムを配置できますが、ビューにカスタムボタンを配置するのではなく、ナビゲーションバーの戻るボタンを使用して親ビューコントローラーに戻ります。

ナビゲーションの[戻る]ボタンをオーバーライドして、巻き戻しセグエアクションを指すようにできないようです。[戻る]ボタンがストーリーボードに表示されないため、緑色の[終了]ボタンをドラッグできません。

戻るボタンでプッシュセグエを巻き戻すことはできますか?

17
Raghavendra

BlankarschからこのStackOverflow質問へのObjective-Cコードに基づく私の解決策は次のとおりです。 [戻る]ボタンイベントをトラップする方法

このコードを、[戻る]ボタンの呼び出しをトラップするビューコントローラー内に配置します。

override func didMoveToParentViewController(parent: UIViewController?) {
    if (!(parent?.isEqual(self.parentViewController) ?? false)) {
        println("Back Button Pressed!")
    }
}

Ifブロックの内部で、返す必要があるすべてのものを処理します。また、現時点では親とself.parentViewControllerの両方がnilである可能性が高いため、ビューコントローラの呼び出しへの参照を戻す必要があるため、ビューコントローラツリーをナビゲートできません。

また、[戻る]ボタンを押しても親がnilにならない場合を見つけなかったので、nilの親をチェックするだけで済むかもしれません。したがって、このようなものはもう少し簡潔です:

override func didMoveToParentViewController(parent: UIViewController?) {
    if (parent == nil) {
        println("Back Button Pressed!")
    }
}

しかし、私はそれがいつもうまくいくことを保証することはできません。

4
Big Red

ある戻るボタンというビューコントローラーで次の操作を行います。

Swift

override func didMove(toParentViewController parent: UIViewController?) {
    if !(parent?.isEqual(self.parent) ?? false) {
        print("Parent view loaded")
    }
    super.didMove(toParentViewController: parent)
}
3
John R Perry

私も同じことを試しましたが、標準の戻るボタンのアクションをキャッチできないようです。解決策は、カスタムボタンを使用して、前のページに戻るセグエにバインドすることです。

0
zisoft

ある種の委任を使用するか、カスタムの戻るボタンと巻き戻しセグエを使用できます。

さらに、メディエーターを使用してビューコントローラー間でデータを受け渡すこともできます。

http://cocoapatterns.com/passing-data-between-view-controllers/

0
joakim