我正在Swift中开发一个iOS应用程序。
我想使用prepareForSegue函数将视图中的数据发送到另一个视图。
但是,我的目标视图前面是导航控制器,所以它不起作用。
我该怎么办呢?
答案 0 :(得分:116)
在prepareForSegue
中访问目标导航控制器,然后访问其顶部:
let destinationNavigationController = segue.destination as! UINavigationController
let targetController = destinationNavigationController.topViewController
您可以从目标控制器访问其视图并传递数据。
在旧的 - 现在已经过时 - 版本的Swift和UIKit中,代码略有不同:
let destinationNavigationController = segue.destinationViewController as UINavigationController
let targetController = destinationNavigationController.topViewController
答案 1 :(得分:25)
假设您要将数据从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 !"
}}
将标识符segue编辑为" showNavigationController"
此
var data : String = ""
override func viewDidLoad() {
super.viewDidLoad()
print("data from ReceiveViewController is \(data)")
}
当然你可以发送任何其他类型的数据(int,Bool,JSON ......)
答案 2 :(得分:14)
使用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
}
}
答案 3 :(得分:4)
以下是Swift 3的答案:
let svc = segue.destination as? UINavigationController
let controller: MyController = svc?.topViewController as! MyController
controller.myProperty = "Hi there"
答案 4 :(得分:3)
Swift 3中的一个班轮:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination.childViewControllers[0] as? FooController {
vc.variable = localvariable
}
}
答案 5 :(得分:1)
在Swift 5中
如果您不仅必须从SourceViewController选择到嵌入在UINavigationController中的DestinationViewController,而且还选择到新的Storyboard,则请执行以下操作...
在Interface Builder中,将对象库中的“ Storyboard Reference”对象放置在源ViewController旁边,然后将序列拖到该对象上(例如,从SourceViewController视图上的按钮)。例如,将segue标识符命名为“ ToOtherStoryboard”。
转到NavigationViewController并使用Identity Inspector为它提供一个Storyboard ID。 “ DestinationNavVC”可以。
单击在步骤1中创建的Storyboard Reference图标,然后在其属性检查器的“ Referenced ID”字段中,输入您在步骤2中为UINavigationController编写的Storyboard ID。这将创建从源到DestinationViewController的序列。无论您在源ViewController的源文件中写入什么内容。这是因为设置到NaviationController会自动显示UINavigationController的根ViewController(第一个)。
(可选)如果您需要将数据与segue一起附加并发送到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
}
}
如果您只是想从一个ViewController移到另一个ViewController,则无需使用PrepareForSegue,上面的方法将起作用(不执行步骤3)
在用于启动segue的按钮的IBAction Outlet方法中,您将编写:
performSegue(withIdentifer: "ToOtherStoryboard", sender: self)
答案 6 :(得分:1)
跳过UINavigationController
的检查是个好主意,因为可能有多个segues
使用navigationController
,因此每检查segue
都会检查该检查使用navigationController
。更好的方法是检查viewController
中的第一个children
并将其转换为您要查找的viewController
。
if let destVC = segue.destination.children.first as? MyViewController {
destVC.hideBottomBar = true
}
答案 7 :(得分:0)
在segue arrow属性中设置标识符名称,以便在performeSegue中使用。
赞:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc: ProfileViewController = segue.destination as? ProfileViewController {
//do any setting to the next screen
}
}
然后:
performSegue(withIdentifier: "yourIdentifierOfViewProfile", sender: indexPath.row)
希望对您有帮助。