如何快速将数据从视图控制器传递到容器视图

Posted

技术标签:

【中文标题】如何快速将数据从视图控制器传递到容器视图【英文标题】:How to pass data from View Controller to Container View in swift 【发布时间】:2020-06-25 10:13:22 【问题描述】:

这是我的屏幕......

我想将数据从离线视图控制器传递到 InstantVC。我不知道该怎么做????。 基本上,我已经分段控制器。当用户选项卡 Instant 它显示分段视图控制器并隐藏调度视图控制器。并根据选定的分段传递数据。

这是传递数据的离线视图控制器


                switch response.result 

                case .success:
                    if let result = response.data 

                        do 

                            let resultIs = try JSONDecoder().decode(GetActiveOrderModel.self, from:result)
                            print("Massage:  \(resultIs.state)")
                            if let results = resultIs.orderData
                                let storyboard = UIStoryboard(name: "Rider", bundle: nil)
                                let vc = storyboard.instantiateViewController(withIdentifier: "instantVC") as! InstantVC


                                print(" Order ID is  \(results.orderId)")
                                vc.arryOfOrder.append(results.orderId!)
//navigationController?.pushViewController(vc, animated: true)

                            
                         catch 
                            print(error)

                        
                    

                case .failure(let error):
                    print(error)


                

这里是来自离线 VC 的不稳定数据的即时视图控制器

var arryOfOrder = [Int]()
    
    
    override func viewDidLoad() 
        super.viewDidLoad()
        
       
        print("---------->>>>>>>>> \(arryOfOrder)")
        
    
    
    
    // MARK: - Custom Functions
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return arryOfOrder.count
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! CellForInstantVC
        
        
        
        cell.orderNum.text = "\(arryOfOrder[indexPath.row])"
        
        return cell
        
        
    
    
    func addOrderNumber(orderNumber : Int)
        
        arryOfOrder.append(orderNumber)
        
    
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
        return 120
    

【问题讨论】:

【参考方案1】:

您可以使用 prepare Segue 访问 Container 控制器并保存其引用

class Master: UIViewController, ContainerToMaster 

@IBOutlet var containerView: UIView!

var containerViewController: Container?

@IBOutlet var labelMaster: UILabel!

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if segue.identifier == "containerViewSegue" 
        containerViewController = segue.destinationViewController as? Container
        
    

然后就可以使用containerViewController传递数据了

containerViewController?.arryOfOrder  = ArrayOfOrder

或者您可以在容器中使用函数...将 ArrayOfOrder 传递给该函数..这也将重新加载 tableView

containerViewController?.updateData(dataArray: ArrayOfOrder)

【讨论】:

【参考方案2】:

如果您想将父类中发生的操作的数据从父级传递给子级,您可以使用访问当前UIViewController 的子级

children.forEach  (viewController) in
     if let temp = viewController as? InstantVC
          temp.property = dataToPass
     

仅当您的两个视图控制器始终作为父级的子级并且永远不会被删除时,上述内容才有效。如果您将它们作为子元素删除并在稍后阶段重新添加它们,您将需要维护对子元素的引用并更新该引用,因为子数组不会有 UIViewController。但由于您使用的是情节提要,这应该可以正常工作。

如果您想通过子类的操作访问数据,您可以使用以下方式访问父视图控制器:

let dataToUse = (parent as? OfflineVC).someProperty

【讨论】:

以上是关于如何快速将数据从视图控制器传递到容器视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在容器视图和主视图控制器之间正确传递数据

快速将图像从一个视图控制器传递到另一个视图控制器

将图像从集合视图控制器快速传递到另一个视图控制器

如何从视图控制器发送数据以在 swift 5 中嵌入视图控制器?

如何将数据从表视图传递到另一个视图控制器

如何将 JSON 数据从登录视图传递到多个视图控制器,是不是可能?