私はSwiftでiOSアプリケーションを開発しています。
PrepareForSegue関数を使用して、ビューから別のビューにデータを送信したい。
ただし、ターゲットビューの前にNavigation Controllerが配置されているため、機能しません。
どうすればこれを行うことができますか?
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
SendViewControllerからReceiveViewControllerにデータを送信するとします。
これを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 !"
}}
識別子セグエを「showNavigationController」に編集します
この
var data : String = ""
override func viewDidLoad() {
super.viewDidLoad()
print("data from ReceiveViewController is \(data)")
}
もちろん、他のタイプのデータ(int、Bool、JSONなど)を送信できます
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
}
}
Swift 3の答えは次のとおりです。
let svc = segue.destination as? UINavigationController
let controller: MyController = svc?.topViewController as! MyController
controller.myProperty = "Hi there"
Swift 3の1つのライナー:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination.childViewControllers[0] as? FooController {
vc.variable = localvariable
}
}
Swift 5で
SourceViewControllerからUINavigationControllerに埋め込まれたDestinationViewControllerだけでなく、新しいStoryboardにもセグエする必要がある場合は、次の手順を実行します。
Interface BuilderのソースViewControllerの隣のオブジェクトライブラリから「ストーリーボード参照」オブジェクトを配置し、セグエをそれにドラッグします(たとえば、SourceViewControllerビューのボタンから)。たとえば、セグエ識別子に「ToOtherStoryboard」という名前を付けます。
NavigationViewControllerに移動し、IDインスペクターを使用してストーリーボードIDを指定します。 「DestinationNavVC」はそうします。
ステップ1で作成したStoryboard Referenceアイコンをクリックし、その属性インスペクターの「Referenced ID」フィールドに、ステップ2でUINavigationControllerに書き込んだStoryboard IDを入力します。ソースViewControllerのソースファイル。これは、NaviationControllerに設定すると、UINavigationControllerのルートViewController(最初のもの)が自動的に表示されるためです。
データを添付して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
}
}
セグエの開始に使用したボタンのIBActionアウトレットメソッドで、次のように記述します。
performSegue(withIdentifer: "ToOtherStoryboard", sender: self)