如何将数据从viewController传递到swiftUI视图?

电视

我正在使用ARkit来检测图像的应用程序。当检测到资产文件夹中的图像时,该应用程序将在图像顶部显示一个swiftUI视图,而当不再跟踪图像时,该swiftUI视图将消失。到这里为止一切正常。

在viewController文件的viewdidload方法中,我正在从Internet下载并解析一个csv文件。这也有效。

我正在努力的工作是弄清楚如何将从viewdidload中的csv文件解析的数据传递到swiftUI视图,以便我可以在正在创建的swiftUI视图上使用这些数据。例如,我将根据检测到的图像显示特定的数据。

我发现了其他stackoverflow问题,他们在这里讨论如何在视图控制器之间而不是在视图控制器和swiftUI视图之间传递数据。

下面是我的代码。

这是我的ViewController.swift文件

import UIKit
import SceneKit
import ARKit
import SwiftUI

class ViewController: UIViewController, ARSCNViewDelegate {

    @IBOutlet var sceneView: ARSCNView!
    

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set the view's delegate
        sceneView.delegate = self
        
        // load csv file from dropbox
        let url = URL(string: "https://www.dropbox.com/s/0d0cr5o9rfxzrva/test.csv?dl=1")!
        let task = URLSession.shared.downloadTask(with: url) { location, response, error in
            guard let location = location else { return }
            do {
                // get path to directory
                let documentDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
                print(documentDirectory.path)
                // giving name to file
                let name = (response as? HTTPURLResponse)?.suggestedFilename ?? location.lastPathComponent
                //create a destination url
                let destination = documentDirectory.appendingPathComponent(name)
                // check if file already exist
                if FileManager.default.fileExists(atPath: destination.path) {
                    //remove the file
                   try FileManager.default.removeItem(at: destination)
                }
                // move file from old to new url
                try FileManager.default.moveItem(at: location, to: destination)
                // reading the file
                let data = try String(contentsOf: destination, encoding: .utf8)
                
                //parsed csv
                let datos = self.csv(data: data)
                print(datos)
                
            } catch {
                print("ERROR", error)
            }
        }
        task.resume()
        
    }
    

    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        // Create a session configuration
        let configuration = ARImageTrackingConfiguration()

        guard let trackingImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil) else {
        
            fatalError("Couldn't load tracking images")
            
            }
           
            configuration.trackingImages = trackingImages
            
        configuration.maximumNumberOfTrackedImages = 2
        
        // Run the view's session
        sceneView.session.run(configuration)
    }
        
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        
        // Pause the view's session
        sceneView.session.pause()
    }

    // MARK: - ARSCNViewDelegate
    

    // Override to create and configure nodes for anchors added to the view's session.
    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
        
        guard let imageAnchor = anchor as? ARImageAnchor else {return nil}
        
        
        let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width,
                         height: imageAnchor.referenceImage.physicalSize.height)
        
    
        let planeNode = SCNNode(geometry: plane)
        
        planeNode.eulerAngles.x = -.pi / 2
        
        
        if let imageName = imageAnchor.referenceImage.name {
            imageController(for: planeNode, imageName: imageName)
            
        }
    
        
        let node = SCNNode()
        node.addChildNode(planeNode)
        return node
            
        }

   


    func imageController(for node: SCNNode, imageName: String) {
    
    
        let imgView = UIHostingController(rootView: imageView(imageName: imageName))
    
    DispatchQueue.main.async {
        imgView.willMove(toParent: self)
        
        self.addChild(imgView)
        
        imgView.view.frame = CGRect(x: 0, y: 0, width: 500, height: 500)
        
        self.view.addSubview(imgView.view)
        
        self.showImageView(hostingVC: imgView, on: node)
        
    }
    
    }

    

func showImageView(hostingVC: UIHostingController<imageView>, on node: SCNNode) {
        
        let material = SCNMaterial()
        
        hostingVC.view.isOpaque = false
        material.diffuse.contents = hostingVC.view
        node.geometry?.materials = [material]
        
        hostingVC.view.backgroundColor = UIColor.clear
        
    }

    
// parsing csv method
    func csv(data: String) -> [[String]] {
        var result: [[String]] = []
        let rows = data.components(separatedBy: "\n")
        for row in rows {
            let columns = row.components(separatedBy: ",")
            result.append(columns)
            
        }
        return result
    }
    
   
}

这是我的swiftUI视图文件

import SwiftUI

struct imageView: View {

    var imageName: String

    var body: some View {
        
        ZStack{
        Color.white
            Text("hello \(imageName)")
            
        }
            
        
    }
}
卢佛朗哥

您希望datos将其传递给View的构造函数,但datos您的代码中唯一的一个对象是闭包中的局部变量。

您需要在VC中创建一个新属性

var datos: [[String]]?

然后,当您获取数据时,将其保存在此属性中

self.datos = ....

然后,当您构建视图时, self.datos

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将数据从模态视图列表传递到 SwiftUI 中的父视图?

如何将数据从viewcontroller传递到tabbarcontroller到navaigationcontroller?

如何将数据从父模型类传递到 SwiftUI 中的子视图

如何将数据从 SwiftUI 中的 ContentView 传递到子视图

didSet之后如何将数据从AppDelegate传递到ViewController?

如何将模型数据从ViewController传递到ViewModel

如何将数据从API调用传递到ViewController?

如何将FSCalendar数据从UIKIT传递到SwiftUI

如何将数据从视图传递到父布局?

如何将数据从多个模型传递到视图?

将数据从SwiftUI视图传递到UIViewController

如何将数据从 ViewController 传递到标签栏 iOS 中的 ViewController?

如何将数据从 ViewController3 传递到 ViewController1

将数据从ViewController传递到可表示的SwiftUI

如何将数据从视图控制器传递到其他视图控制器

如何将数据从集合视图传递到表视图类?

如何将Firebase数据从表视图单元传递到视图控制器?

Swift / iOS:如何将数据从 AppDelegate 传递到 ViewController 标签?

如何将数据从可解码模型传递或实现到 ViewController?

如何将数据从ViewController传递到嵌入式View Controller

如何将数据传递到ViewController并加载,然后再将其推入Navigation堆栈?

如何将列表视图数据传递到SQLite数据库?

如何将图像从集合视图传递到集合视图

SwiftUI-将数据传递到不同的视图

将数据从简单的NSView传递到SwiftUI视图

如何将参数从appDelegate传递到ViewController?

如何将 SwiftUI 中的静态值从一个视图传递到另一个视图?

如何将所选数据从视图传递到控制器,然后再从控制器传递回视图

如何将核心数据传递到SwiftUI TextField中