【问题标题】:Swift pass data through navigation controllerSwift 通过导航控制器传递数据
【发布时间】:2014-10-11 17:26:49
【问题描述】:

我的一个 segues 从视图控制器过渡到 tableview 控制器。我想在两者之间传递一个数组,但是在 tableview 控制器之前有一个导航控制器,我不知道如何传递数组。如何通过 navigatiom 控制器将数据传递给 tableview 控制器?

【问题讨论】:

    标签: ios swift segue


    【解决方案1】:

    覆盖 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   
    }
    

    【讨论】:

    • 代替navVC.viewControllers.first,你可以做navVC.topViewController
    • 如果它是来自 topViewController 的视图控制器 segue 怎么办?
    【解决方案2】:

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

    【讨论】:

    • 错误:“UINavigationController”类型的值没有成员“yourTableViewArray”! (使用 Swift3)
    【解决方案3】:

    @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 
    
    
                }
    
            }
    
        }
    
    }
    

    【讨论】:

      【解决方案4】:

      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
          }
      

      【讨论】:

        【解决方案5】:

        我在 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
        }
        

        【讨论】:

        • 完美解决方案,只是为了澄清一下,如果从 AppDelegate 呈现,使用 self.window?.... 并留下 //present 注释,如果从 ViewController 呈现,注释 // self.window?.. . 并取消注释存在(控制器
        • 是的,因为 present() 需要 ViewController。是不是!但是我已经有一段时间没有接触到这个了。您可以通过实际测试来确认,并可能留下评论或建议编辑答案。我一定会更新的。
        • 是的,没关系,self.window?.rootViewController = controller 如果从 AppDelegate 呈现,如果从 ViewController 呈现呈现(控制器,动画:true,完成:nil),只需选择您的案例并评论另一个
        【解决方案6】:

        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 
            }
        

        【讨论】:

        • 非常好。 TY TY
        【解决方案7】:

        在 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
        
        }
        

        【讨论】:

          【解决方案8】:

          斯威夫特 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
          猜你喜欢
          • 1970-01-01
          • 2016-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-10
          • 1970-01-01
          相关资源
          最近更新 更多