web-dev-qa-db-ja.com

Swift:Navigation Controllerを備えたprepareForSegue

私はSwiftでiOSアプリケーションを開発しています。

PrepareForSegue関数を使用して、ビューから別のビューにデータを送信したい。

ただし、ターゲットビューの前にNavigation Controllerが配置されているため、機能しません。

どうすればこれを行うことができますか?

60
cedric petetin

prepareForSegueで、ターゲットNavigation Controllerにアクセスしてから、そのトップ:

let destinationNavigationController = segue.destination as! UINavigationController
let targetController = destinationNavigationController.topViewController

ターゲットコントローラから、そのビューにアクセスしてデータを渡すことができます。

古い-現在は廃止-SwiftおよびUIKitのバージョンでは、コードがわずかに異なっていました。

let destinationNavigationController = segue.destinationViewController as UINavigationController
let targetController = destinationNavigationController.topViewController
124
Wojtek Surowka

SendViewControllerからReceiveViewControllerにデータを送信するとします。

  1. これをSendViewControllerに追加します

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "segueShowNavigation"{
        var DestViewController = segue.destinationViewController as! UINavigationController
        let targetController = DestViewController.topViewController as! ReceiveViewController
        targetController.data = "hello from ReceiveVC !"
    }}
    
  2. 識別子セグエを「showNavigationController」に編集します

screenshot

  1. ReceiveViewControllerに追加します

この

var data : String = ""

override func viewDidLoad() {
    super.viewDidLoad()
    print("data from ReceiveViewController is \(data)")
}

もちろん、他のタイプのデータ(int、Bool、JSONなど)を送信できます

26
mattyU

optional bindingおよびSwift 3&4を使用して完全な回答

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let navigationVC = segue.destination as? UINavigationController, let myViewController = navigationVC.topViewController as? MyViewControllerClass {
        myViewController.yourProperty = myProperty
    }
}
16
jason z

Swift 3の答えは次のとおりです。

let svc = segue.destination as? UINavigationController

let controller: MyController = svc?.topViewController as! MyController
controller.myProperty = "Hi there"
4

Swift 3の1つのライナー:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  if let vc = segue.destination.childViewControllers[0] as? FooController {
    vc.variable = localvariable
  }
}
3
JoeGalind

Swift 5で

SourceViewControllerからUINavigationControllerに埋め込まれたDestinationViewControllerだけでなく、新しいStoryboardにもセグエする必要がある場合は、次の手順を実行します。

  1. Interface BuilderのソースViewControllerの隣のオブジェクトライブラリから「ストーリーボード参照」オブジェクトを配置し、セグエをそれにドラッグします(たとえば、SourceViewControllerビューのボタンから)。たとえば、セグエ識別子に「ToOtherStoryboard」という名前を付けます。

  2. NavigationViewControllerに移動し、IDインスペクターを使用してストーリーボードIDを指定します。 「DestinationNavVC」はそうします。

  3. ステップ1で作成したStoryboard Referenceアイコンをクリックし、その属性インスペクターの「Referenced ID」フィールドに、ステップ2でUINavigationControllerに書き込んだStoryboard IDを入力します。ソースViewControllerのソースファイル。これは、NaviationControllerに設定すると、UINavigationControllerのルートViewController(最初のもの)が自動的に表示されるためです。

  4. データを添付してDestinationViewController内のプロパティに送信するには、SourceViewControllerファイルのPrepare-For-Segueメソッド内に次のコードを記述します。

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "ToOtherStoryboard" {
            let destinationNavVC = segue.destination as! UINavigationController
            let destinationVC = destinationNavVC.topController as!     DestinationViewController
    
            destinationVC.name = nameTextField.text // for example
            destinationVC.occupation = occupationTextField.text
        }
    }
    
  5. セグエの開始に使用したボタンのIBActionアウトレットメソッドで、次のように記述します。

    performSegue(withIdentifer: "ToOtherStoryboard", sender: self)
    
0
Jack Pitts