34563


NavigationControllerでつないだ親画面A、子画面Bがあります。

私は子画面から親画面に戻る時に値を渡したいので

[code]

        <B ViewController>
    override func viewWillDisappear(animated: Bool) {
        let viewController = self.parentViewController as! A ViewController
        viewController.x = 1 //xはA画面の変数
    }
    
[/code]

のようにしました。  
しかし

[code]

    Could not cast value of type 'UINavigationController'
    
[/code]

とエラーが出ます。  
この問題を解決するための方法を教えて欲しいです。

また上記の方法に代わる方法があれば  
教えてもらえると助かります。

どうかよろしくお願いします。

* * *

一度、unwindを使いましたが私はnavi‌​gation
barに出てくるbackボタンを押したときに値を渡したいんのですがunwindではできませんでした。


CC BY-SA 3.0
2017-05-07T14:33:29.933
34521
2017-05-09T06:48:42.397
2017-05-08T23:57:04.783
18540
18539
question
swift uinavigationcontroller
NavigationBarのバックボタンを押した時に、値を渡したい。


NavigationBarのBackボタンを押した時、おっしゃるとおり、UnwindセグエのActionメソッドは呼ばれません。しかし、`UINavigationControllerDelegate`の`navigationController(_:willShow:animated:)`は呼ばれるので、これを利用します。

_BViewController_

[code]

    import UIKit
    
    class NextViewController: UIViewController, UINavigationControllerDelegate {
    // クラス宣言に、UINavigationControllerDelegateを追加。
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // BViewController自身をDelegate委託相手とする。
            navigationController?.delegate = self
        }
    
        // UINavigationControllerDelegateのメソッド。遷移する直前の処理。
        func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
            // 遷移先が、AViewControllerだったら……
            if let controller = viewController as? AViewController {
                // AViewControllerのプロパティvalueの値変更。
                controller.value = 100
            }
        }
    
    }
    
[/code]

_AViewController_

[code]

    import UIKit
    
    class AViewController: UIViewController {
    
        var value: Int = 0 {
            didSet {
                print("New value = \(value)")
            }
        }
        // プロパティオブザーバにする必要はないが、Delegateメソッドが働いていることを確認するため実装しています。
    
        // Other codes
    
    }
    
[/code]

* * *

> NavigationControllerでつないだ親画面A、子画面Bがあります。

`UINavigationController`ベースの画面遷移で、遷移元、遷移先の関係を親子と表現するのは、なじみがよくありません。`UIViewController`のプロパティ`parentViewController`は、エラーメッセージに述べられているように、親は`UINavigationController`になります。`AViewContoller`と`BViewController`は、子どうし、むしろ兄弟関係というべきでしょう。

> let viewController = self.parentViewController as! A ViewController

Swiftの書式では、変数名にスペースを含めることはできません。`A
ViewController`ではエラーになるか、誤動作になります。`AViewController`とするか、アンダーバーを使って、`A_ViewController`としてください。


CC BY-SA 3.0
2017-05-08T23:14:42.413
34563
2017-05-09T06:48:42.397
2017-05-09T06:48:42.397
18540
18540
34521
answer