通过导航控制器传递数据的Swift方法

71

我的一个segue从一个视图控制器转到一个表格视图控制器。我想在两者之间传递一个数组,但是在表格视图控制器之前有一个导航控制器,我无法弄清楚如何传递数组。如何通过导航控制器将数据传递给表格视图控制器?

8个回答

136

重写 prepareForSegue 方法并设置您想要的任何值到表视图上。你可以从UINavigationviewControllers 属性中获取表视图。

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   
}

21
可以使用 navVC.topViewController 替代 navVC.viewControllers.first。 - Arnaud
如果它是从topViewController进行的视图控制器segue,会怎样呢? - Jenita _Alice4Real

24

@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 


            }

        }

    }

}

12

SWIFT 3(测试解决方案)- 通过带有导航控制器的Segue在VC之间传递数据

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        let navigationContoller = segue.destination as! UINavigationController

        let receiverViewController = navigationContoller?.topViewController as ReceiverViewController

        receiverViewController.reveivedObject = sentObject 
    }

1
非常好。谢谢。 - Justin

12

在使用Horatio的解决方案时,我遇到了这个错误

ERROR: Value of type 'UINavigationController' has no member 'yourTableViewArray'

因此,这可能会帮助像我一样寻找代码解决方案的其他人。我想将页面重定向到一个导航控制器,并在该导航控制器中向根视图控制器传递数据。

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
}

1
完美的解决方案,只是为了澄清,如果从AppDelegate呈现,请使用self.window?...并留下// present注释,如果从ViewController呈现,请注释// self.window?...并取消注释present(controller)。 - Alejandro Luengo
1
是的,因为present()需要ViewController。不是吗!但是我已经有一段时间没有接触过这个了。您可以通过实际测试来确认,并可能留下评论或建议答案的编辑。我一定会更新的。 - mythicalcoder
1
没问题,如果是从AppDelegate呈现,请使用self.window?.rootViewController = controller,如果是从ViewController呈现,请使用present(controller, animated: true, completion: nil),只需选择您的情况并注释另一个即可。 - Alejandro Luengo

8

Tommy的解决方案需要在故事板中设置Segue。

以下是仅使用代码的解决方案:

func functionToPassAsAction() {
    var controller: UINavigationController
    controller = self.storyboard?.instantiateViewControllerWithIdentifier("NavigationVCIdentifierFromStoryboard") as! UINavigationController 
    controller.yourTableViewArray = localArrayValue
    self.presentViewController(controller, animated: true, completion: nil)
}

2
错误:类型“UINavigationController”没有成员“yourTableViewArray”!!(使用Swift3) - mythicalcoder

5

Swift 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)

1
仅针对代码的方法的最佳解决方案。甚至不知道导航控制器上存在topViewController属性。 - colin

3

修正 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
    }

0

在Swift 4中将文本传递到TableView **或者只是传递数据但更改函数**

第一个视图控制器

 let name_array = ["BILL GATES", "MARK ZUKERBERG", "DULKAR SALMAN", "TOVINO" , "SMITH"]

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){

在UITableView中选择行时的函数:

    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)

第二个视图控制器

class SecondViewController: UIViewController {

@IBOutlet weak var lbl2: UILabel!

var str1 = String()

override func viewDidLoad() {
    super.viewDidLoad()

     lbl2.text =  str1

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接