【发布时间】:2014-10-11 17:26:49
【问题描述】:
我的一个 segues 从视图控制器过渡到 tableview 控制器。我想在两者之间传递一个数组,但是在 tableview 控制器之前有一个导航控制器,我不知道如何传递数组。如何通过 navigatiom 控制器将数据传递给 tableview 控制器?
【问题讨论】:
我的一个 segues 从视图控制器过渡到 tableview 控制器。我想在两者之间传递一个数组,但是在 tableview 控制器之前有一个导航控制器,我不知道如何传递数组。如何通过 navigatiom 控制器将数据传递给 tableview 控制器?
【问题讨论】:
覆盖 prepareForSegue 并在 tableview 上设置您想要的任何值。您可以从 UINavigation viewControllers 属性中获取 tableview。
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!){
let navVC = segue.destinationViewController as UINavigationController
let tableVC = navVC.viewControllers.first as YourTableViewControllerClass
tableVC.yourTableViewArray = localArrayValue
}
对于 Swift 3:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let navVC = segue.destination as? UINavigationController
let tableVC = navVC?.viewControllers.first as! YourTableViewControllerClass
tableVC.yourTableViewArray = localArrayValue
}
【讨论】:
Tommy 的解决方案要求您在 Storyboard 中设置 Segue。
这是一个纯代码解决方案:
func functionToPassAsAction() {
var controller: UINavigationController
controller = self.storyboard?.instantiateViewControllerWithIdentifier("NavigationVCIdentifierFromStoryboard") as! UINavigationController
controller.yourTableViewArray = localArrayValue
self.presentViewController(controller, animated: true, completion: nil)
}
【讨论】:
@Tommy Devoy 的回答是正确的,但在 swift 3 中也是如此
更新了 Swift 3
// MARK: - Navigation
//In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
if segue.identifier == "yourSegueIdentifier" {
if let navController = segue.destination as? UINavigationController {
if let chidVC = navController.topViewController as? YourViewController {
//TODO: access here chid VC like childVC.yourTableViewArray = localArrayValue
}
}
}
}
【讨论】:
SWIFT 3 的固定语法
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let navVC = segue.destination as! UINavigationController
let tableVC = navVC.viewControllers.first as! YourTableViewControllerClass
tableVC.yourTableViewArray = localArrayValue
}
【讨论】:
我在 Horatio 的解决方案中遇到了这个错误。
ERROR: Value of type 'UINavigationController' has no member 'yourTableViewArray'
所以这可能会帮助像我这样寻找code 唯一解决方案的其他人。我想重定向到导航控制器,但将数据传递到该导航控制器中的根视图控制器。
if let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "yourNavigationControllerID") as? UINavigationController,
let yourViewController = controller.viewControllers.first as? YourViewController {
yourViewController.yourVariableName = "value"
self.window?.rootViewController = controller // if presented from AppDelegate
// present(controller, animated: true, completion: nil) // if presented from ViewController
}
【讨论】:
SWIFT 3(经过测试的解决方案) - 在 VC 之间传递数据 - 使用 NavigationController 进行 Segue
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let navigationContoller = segue.destination as! UINavigationController
let receiverViewController = navigationContoller?.topViewController as ReceiverViewController
receiverViewController.reveivedObject = sentObject
}
【讨论】:
在 tableview swift 4 中传递文本 **或者只是传递数据但改变功能**
第一个视图控制器
类
let name_array = ["BILL GATES", "MARK ZUKERBERG", "DULKAR SALMAN", "TOVINO" , "SMITH"]
func tableView(_tableView: UITableView, didSelectRowAt indexPath: IndexPath){
let story: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let new = story.instantiateViewController(withIdentifier: "SecondViewController")as! SecondViewController
new.str1 = name_array[indexPath.row]
self.navigationController?.pushViewController(new, animated: true)
第二个视图控制器
类 SecondViewController: UIViewController {
@IBOutlet weak var lbl2: UILabel!
var str1 = String()
override func viewDidLoad() {
super.viewDidLoad()
lbl2.text = str1
}
【讨论】:
斯威夫特 5
class MyNavigationController: UINavigationController {
var myData: String!
override func viewDidLoad() {
if let vc = self.topViewController as? MyViewcontoller{
vc.data = self.myData
}
}
}
let navigation = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MyNavigationController") as! MyNavigationController
navigation.myData = "Data that you want to pass"
present(navigation, animated: true, completion: nil)
【讨论】:
topViewController 属性存在于navigation controller