RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1325438
Accepted
Роман
Роман
Asked:2022-09-05 06:10:00 +0000 UTC2022-09-05 06:10:00 +0000 UTC 2022-09-05 06:10:00 +0000 UTC

将数据从 Api 传递到数组以在屏幕上显示

  • 772

其本质是数据解析的管理器

    import Foundation


protocol NetworkDataManagerDelegate: AnyObject {
    func updateInterface( _: NetworkDataManager, with currenData: CurrentData)
}

class NetworkDataManager {
    weak var delegate: NetworkDataManagerDelegate?
    func fetchCurrentData() {
        let urlString = "https://run.mocky.io/v3/1d1cb4ec-73db-4762-8c4b-0b8aa3cecd4c"
        guard let url = URL(string: urlString) else {return}
        let urlSession = URLSession(configuration: .default)
        let task = urlSession.dataTask(with: url) { data, responce, error in
            if let data = data {
                if let currentData = self.parseJSON(withData: data){
                    self.delegate?.updateInterface(self, with: currentData)
                }
            }
        }
        
        task.resume()
    }
    
    func parseJSON(withData data: Data) -> CurrentData?{
        
        let decoder = JSONDecoder()
        do {
            let currentDataData = try decoder.decode(CurrentDataData.self, from: data)
            guard let currentData = CurrentData(currentDataData: currentDataData) else {return nil}
            return currentData
        } catch let error as NSError {
            print(error)
        }
        return nil
    }
    
}

在tableViewController上我背叛了协议,其中有一个updateInterface()类,问题是如何将数据传输到单元格数组中,以便需要拉起单元格的数量?单元有一个单独的 viewController,它们实际连接到该 viewController。

查看单元格

    import UIKit

class CustomCell: UITableViewCell {

    @IBOutlet weak var skilsLable: UILabel!
    @IBOutlet weak var numbeLable: UILabel!
    @IBOutlet weak var nameLable: UILabel!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

}

这是 tableViewController 本身

    class MyTableViewController: UITableViewController {

    var cell: [String] = []
    let network = NetworkDataManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        network.fetchCurrentData()
        network.delegate = self

        tableView.rowHeight = 150
        self.title = "Team of Developer"
    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return cell.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell
        return cell
    }
}


extension MyTableViewController: NetworkDataManagerDelegate{
    func updateInterface(_: NetworkDataManager, with currenData: CurrentData) {
        
    }
    
    
}

在此处输入图像描述

swift
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    schmidt9
    2022-09-05T23:32:22Z2022-09-05T23:32:22Z

    您没有在问题中提供数据模型,让我们假设它是,尽管当然CurrentDataData最好重命名它或完全不使用它,立即使用CurrentData

    class CurrentData {
        var currentDataData: CurrentDataData?
        
        init?(currentDataData: CurrentDataData?) {
            self.currentDataData = currentDataData
        }
    }
    
    struct Employee : Decodable {
        var name: String
        var phone_number: String
        var skills: [String]
    }
    
    struct Company : Decodable {
        var name: String
        var employees: [Employee]
    }
    
    struct CurrentDataData : Decodable {
        var company: Company
    }
    

    我还更正了委托调用,最好在主线程中立即完成

        func fetchCurrentData() {
            let urlString = "https://run.mocky.io/v3/1d1cb4ec-73db-4762-8c4b-0b8aa3cecd4c"
            guard let url = URL(string: urlString) else {return}
            let urlSession = URLSession(configuration: .default)
            let task = urlSession.dataTask(with: url) { data, responce, error in
                if let data = data {
                    if let currentData = self.parseJSON(withData: data){
                        DispatchQueue.main.async {
                            self.delegate?.updateInterface(self, with: currentData)
                        }
                    }
                }
            }
            
            task.resume()
        }
    

    嗯,控制器中的相应编辑

    class MyTableViewController: UITableViewController {
    
        var data: CurrentDataData?
        let network = NetworkDataManager()
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            tableView.register(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "Cell")
            tableView.rowHeight = 150
            
            network.delegate = self
            network.fetchCurrentData()
    
            self.title = "Team of Developer"
        }
    
        // MARK: - Table view data source
    
        override func numberOfSections(in tableView: UITableView) -> Int {
            return 1
        }
    
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return data?.company.employees.count ?? 0
        }
    
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell
            
            guard let employees = data?.company.employees else {
                return cell
            }
            
            let employee = employees[indexPath.row]
            
            cell.nameLable.text = employee.name
            cell.numbeLable.text = employee.phone_number
            cell.skilsLable.text = employee.skills.joined(separator: ",")
            
            return cell
        }
    }
    
    extension MyTableViewController: NetworkDataManagerDelegate{
        func updateInterface(_: NetworkDataManager, with currenData: CurrentData) {
            data = currenData.currentDataData
            tableView.reloadData()
        }
    }
    

    同时,这里有一些改进:

    • 代替委托,使用闭包,这将简化代码
        func fetchCurrentData(_ completion: @escaping (CurrentData) -> Void) {
            let urlString = "https://run.mocky.io/v3/1d1cb4ec-73db-4762-8c4b-0b8aa3cecd4c"
            guard let url = URL(string: urlString) else {return}
            let urlSession = URLSession(configuration: .default)
            let task = urlSession.dataTask(with: url) { data, responce, error in
                if let data = data {
                    if let currentData = self.parseJSON(withData: data){
                        DispatchQueue.main.async {
                            completion(currentData)
                        }
                    }
                }
            }
            
            task.resume()
        }
    
        network.fetchCurrentData {
            self.data = $0.currentDataData
            self.tableView.reloadData()
        }
    
    • 代替直接访问单元中的插座,增加封装并在那里传输数据,并使插座本身成为私有
    class CustomCell: UITableViewCell {
        
        @IBOutlet private weak var skilsLable: UILabel!
        @IBOutlet private weak var numbeLable: UILabel!
        @IBOutlet private weak var nameLable: UILabel!
        
        var employee: Employee? {
            didSet {
                skilsLable.text = employee?.name
                numbeLable.text = employee?.phone_number
                nameLable.text = employee?.skills.joined(separator: ",")
            }
        }
    
    }
    
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell
            
            guard let employees = data?.company.employees else {
                return cell
            }
            
            cell.employee = employees[indexPath.row]
            
            return cell
        }
    
    • 3

相关问题

  • Swift函数:等待数据接收后再返回结果

  • 我在哪里可以找到 SpriteKit 课程/教师/导师?

  • 如果部分中的单元格为空,如何在 tableView 中隐藏部分 SWIFT

  • UITableView 创建部分的问题

  • DataSource 不会在 CollectionView.reloadData() 上触发

  • 无法开启定时器

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5