8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何正确地从 ViewController swift 中删除 func

jginestet 2月前

32 0

我很累,因为我觉得有一个简单的解决方案,但我好几天都找不到!我试图从 ViewController 中删除 parseJSON(),这样它看起来会更好,但删除后它就不起作用了,...

我很累,因为我觉得有一个简单的解决方案,但我好几天都找不到!我试图从 ViewController 中删除 parseJSON(),这样看起来会更好,但删除后它就不起作用了,但它仍在解析数据。在 ViewController 内部,这个函数运行得非常好,并显示带有解析数据的 tableView。我尝试添加 reloadData(),但没有帮助

https://i.sstatic.net/z5lgD.jpg - 截图

class MainViewController: UIViewController {

private var companyModel: CompanyModel? 
private lazy var employeesTable: UITableView = { 
    let table = UITableView(frame: .zero, style: .grouped)
    table.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
    return table
}()

override func viewDidLoad() {
    super.viewDidLoad()
    parseJSON()
    view.addSubview(employeesTable)
    employeesTable.frame = view.bounds
    employeesTable.delegate = self
    employeesTable.dataSource = self
}

private func parseJSON() {
    guard let url = URL(string: "https://run.mocky.io/v3/1d1cb4ec-73db-4762-8c4b-0b8aa3cecd4c") else { return }
    do {
        let jsonData = try Data(contentsOf: url)
        companyModel = try JSONDecoder().decode(CompanyModel.self, from: jsonData)
    } catch {
        print(error)
    }
}

正如您在第二张截图中看到的那样,它正在运行

import Foundation

class NetworkManager {
    
    var companyModel: CompanyModel?
    func parseJSON() {
        guard let url = URL(string: "https://run.mocky.io/v3/1d1cb4ec-73db-4762-8c4b-0b8aa3cecd4c") else { return }
        do {
            let jsonData = try Data(contentsOf: url)
            companyModel = try JSONDecoder().decode(CompanyModel.self, from: jsonData)
        } catch {
            print(error)
        }
    }
}

import UIKit

class MainViewController: UIViewController {
    
    var networkManager = NetworkManager()
    private var companyModel: CompanyModel?
    private lazy var employeesTable: UITableView = {
        let table = UITableView(frame: .zero, style: .grouped)
        table.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        return table
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        networkManager.parseJSON()
        view.addSubview(employeesTable)
        employeesTable.frame = view.bounds
        employeesTable.delegate = self
        employeesTable.dataSource = self
    }
}

但这个不起作用,我做错了什么?

帖子版权声明 1、本帖标题:如何正确地从 ViewController swift 中删除 func
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由jginestet在本站《uitableview》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 您使用/应该使用哪种 companyModel,MainViewController 中的 \'private var companyModel\' 还是 networkManager 的 companyModel?为什么是两个?- 您没有显示表视图数据源方法

  • 您的代码有两个严重问题

    首先,我看到你有两个 companyModel :第一个在类中 NetworkManager ,第二个在类中 MainViewController ,两者之间没有任何联系。当你解析 json 时,表视图会显示数据, MainViewController 因为它连接到 companyModel in MainViewController 。你必须删除其中一个。

    其次,当你从 URL 解析 JSON 时,你应该创建一个异步函数来解析 JSON NetworkManager 。有时从服务器获取数据可能需要很长时间。

    代码如下

    class NetworkManager {
        func parseJSON(completion: @escaping(_ companyModel: CompanyModel?) -> Void) {
            guard let url = URL(string: "https://run.mocky.io/v3/1d1cb4ec-73db-4762-8c4b-0b8aa3cecd4c") else { return }
    
            do {
                let jsonData = try Data(contentsOf: url)
                let companyModel = try JSONDecoder().decode(CompanyModel.self, from: jsonData)
    
                // return data parse from server
                completion(companyModel)
            } catch {
                print(error)
            }
        }
    }
    
    class MainViewController: UIViewController {
        var networkManager = NetworkManager()
        private var companyModel: CompanyModel?
        private lazy var employeesTable: UITableView = {
            let table = UITableView(frame: .zero, style: .grouped)
            table.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
            return table
        }()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            view.addSubview(employeesTable)
            employeesTable.frame = view.bounds
            employeesTable.delegate = self
            employeesTable.dataSource = self
            
            // add this line
            self.initTableViewData()
        }
    
        func initTableViewData() {
            networkManager.parseJSON(completion: {
                companyModel in
                self.companyModel = companyModel
                self.employeesTable.reloadData()
            })
        }
    }
    
返回
作者最近主题: