无法在 View Controller 和 Model 之间传递数据

Posted

技术标签:

【中文标题】无法在 View Controller 和 Model 之间传递数据【英文标题】:Can't pass data between View Controller and Model 【发布时间】:2022-01-23 05:08:02 【问题描述】:

在我的视图控制器中有带有文本字段的 UIAlertController。当用户输入城市名称时,这个数据必须传输给模型,当我得到这个城市的坐标时。但我不能将城市名称从视图控制器传递给模型

我的 UIAlertController:

class MainScrenenViewController: UIViewController 
    
    var delegate: ILocationGroup?

    @objc func locationButtonTap() 
        let alert = UIAlertController(title: "Add city", message: nil, preferredStyle: .alert)
        let addButton = UIAlertAction(title: "Add", style: .default)  action in
           
            self.delegate?.addLocation(alert.textFields?.first?.text ?? "No City")
            
        
        
        alert.addAction(addButton)
        let cancelButton = UIAlertAction(title: "Cancel", style: .default, handler: nil)
        alert.addAction(cancelButton)
        
        alert.addTextField  textField in
            textField.placeholder = "Your City"
        
        
        present(alert, animated: true, completion: nil)
    

我的模特:

protocol ILocationGroup 
    
    func addLocation(_ name: String)
    


class LocationGroup: ILocationGroup 
    
    var mainScreenViewController: MainScrenenViewController?
        
    func addLocation(_ name: String) 
        
        mainScreenViewController?.delegate = self
        
                let url = "https://geocode-maps.yandex.ru/1.x/?apikey=fd93783b-fe25-4428-8c3b-38b155941c8c&format=json&geocode=\(name)"
                
                guard let url = URL(string: url) else  return 
                
                let task = URLSession.shared.dataTask(with: url)  data, response, error in
                    guard let data = data, error == nil else  return 
            
                    do 
                        let result = try JSONDecoder().decode(LocationData.self, from: data)
            
                        
                        print(result.response.geoObjectCollection.metaDataProperty.geocoderResponseMetaData.boundedBy.envelope.lowerCorner)
                    
                    catch 
                        print("failed to convert \(error)")
                    
            
                
                task.resume()
    

【问题讨论】:

您必须在某处设置对mainScreenViewController 的引用。目前还不清楚这两个类是如何相关的。 你还需要在VC中设置委托。目前尚不清楚这是否在显示之前被注入到 VC 中。最后,您将 json 解码为 dataTask 完成块中的局部变量,但随后不对其执行任何操作(除了打印它),因此即使您确实设法将城市数据放入 URLSession,结果位置值也会丢失当关闭完成时。 【参考方案1】:

我认为它应该是 var delegate: LocationGroup()

另外,我不会称它为委托,因为注册委托是 swift 中的关键字

https://manasaprema04.medium.com/different-ways-to-pass-data-between-viewcontrollers-views-8b7095e9b1bf

【讨论】:

以上是关于无法在 View Controller 和 Model 之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

无法在 View Controller iOS Swift 中显示 TabBar

无法从相关的 View Controller 访问 appdelegate 实例变量

使用nuget包下载Entity Framework6.0无法使用模型类与数据库上下文自动生成controller与view

为 iOS 应用创建登录页面:“View Controller”无法访问,因为它没有入口点,也没有运行时访问的标识符

手动模态segue不起作用,View Controller不在窗口层次结构中?

在UITabBarController之前呈现Login View Controller