1

私はviewController2にモーダルセグエを作るviewController1を持っていますが、

viewController2 はナビゲーション コントローラーに埋め込まれています

そこにナビゲーションバーが必要だからです。

viewController2 から viewController1 にデータを送り返すプロトコルを実装しましたが、機能しません。これが私のコードです:

protocol writeValueBackDelegate {
    func writeValueBack(value: String)
}

class viewController1: UITableViewController, writeValueBackDelegate {
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "SelectAddress"{
            if let dest = segue.destinationViewController as? MapAddressViewController{
                dest.delegate = self
            }
        }

    }
}

viewController2 で私はこれを持っています:

class viewController2: UIViewController{
    var delegate: writeValueBackDelegate?

@IBAction func TaskOneClick(sender: AnyObject) {
        delegate?.writeValueBack(txtAddress!.text!)
        self.navigationController?.popViewControllerAnimated(true)
    }
}

理由はわかりませんが、2番目のviewControllerからナビゲーションコントローラーを削除し、viewController 1からviewController 2に直接セグエを作成した場合にのみ機能しますが、ナビゲーションバーを表示するにはナビゲーションコントローラーが必要です。

なぜそれが起こっているのか知っていますか?またはなぜ私が悪いことをしているのか。

4

2 に答える 2

1

これがあなたのセットアップの私の理解です。

ViewController1 -> NavigationController -> ViewController2

この場合、セグエ メソッドの準備では、宛先ビュー コントローラーはナビゲーション コントローラーであり、ViewController2 ではありません。したがって、このコード行は正しくありません。

if let dest = segue.destinationViewController as? MapAddressViewController{
            dest.delegate = self
        }

宛先 VC が MapAddressViewContoller ではなく、代わりに UINavigation コントローラーであるため、そこにあるダウンキャストは失敗します。

これを修正するには、次のようにコードを変更します。

if let dest = segue.destinationViewController as? UINavigationController{
            dest.rootViewController.delegate = self
        }

ただし、NSNotification を使用してデータをビュー コントローラー階層に戻すことを好みます。それも試すことができます。

通知の使用:

  • ステップ 1: VC1 で: 通知を登録します。 override func viewDidLoad() { NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("myFunc:"), name: "SomeName", object: nil) } func myFunc(theNotifiction : NSNotification){ print("I got notified (theNotifiction.userInfo!)") }
    • ステップ 2: VC2 で: 適切なタイミングで通知を投稿します。 NSNotificationCenter.defaultCenter().postNotificationName("SomeName", object: nil, userInfo: ["theKey":"theData"])
于 2015-11-17T04:44:50.413 に答える