【发布时间】:2021-12-31 19:05:12
【问题描述】:
我对 iOS 有点陌生,正在从 GitHub API 进行网络获取,但无法在表格视图中显示用户。下面是代码,
视图控制器:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var avatarImage: UIImageView!
@IBOutlet weak var userName: UILabel!
@IBOutlet weak var usersTableView: UITableView!
var network = Network()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
network.delegate = self
usersTableView.dataSource = self
}
override func viewWillAppear(_ animated: Bool) {
network.network()
}
}
extension ViewController: NetworkDelegate {
func updateTableView() {
DispatchQueue.main.async {
self.usersTableView.reloadData()
}
}
}
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let users = network.users {
print(users.count)
return users.count
} else {
return 0
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
print("CALLED")
let cell = tableView.dequeueReusableCell(withIdentifier: "userCell", for: indexPath) as! UserViewCell
return cell
}
}
顺便说一句,标识符来自 .xib 文件,标识符匹配,我不认为这里出现问题。
网络文件
import Foundation
protocol NetworkDelegate {
func updateTableView()
}
class Network {
var users: [GitHub]?
var delegate: NetworkDelegate?
func network() {
let url = "https://api.github.com/users"
let request: URLRequest?
if let URL = URL(string: url) {
request = URLRequest(url: URL)
URLSession.shared.dataTask(with: request!) { result, response, error in
if let data = result {
// print(String(data: data, encoding: .utf8)!)
self.users = self.parseJSON(data)
self.delegate?.updateTableView()
} else {
print(error!.localizedDescription)
}
}
.resume()
}
}
private func parseJSON(_ data: Data) -> [GitHub]? {
let json = JSONDecoder()
do {
let decodedData = try json.decode([GitHub].self, from: data)
// print(decodedData)
return decodedData
} catch {
print(error.localizedDescription)
}
return nil
}
}
GitHub API 模型
struct GitHub: Codable {
let login: String
let id: Int
let node_id: String
let avatar_url: String
let gravatar_id: String
let url: String
let html_url: String
let followers_url: String
let following_url: String
let gists_url: String
let starred_url: String
let subscriptions_url: String
let organizations_url: String
let repos_url: String
let events_url: String
let received_events_url: String
let type: String
let site_admin: Bool
}
当我在模拟器上运行此代码时,输出为空白(标签下方)
无法弄清楚我做错了什么
提前致谢。
【问题讨论】:
-
如果你在
URLSession.shared.dataTask中放置一个断点,它可能永远不会被触发。您应该使用完成处理程序(而不是委托),因为您不会立即从服务器获得响应。你评论打印功能有用吗? -
是的,打印语句有效,“您应该使用完成处理程序”意味着我应该使用 dispatchQueue 直接在完成处理程序内更新表视图吗?
-
你能检查故事板吗?如果表格视图正确连接到情节提要中的表格视图
-
你确定你得到任何数据吗?是否调用了 tableView 数据源方法(numberOfRows、cellForRowAt...)?
-
它已正确连接,我正在使用 XIB 作为也已连接的视图单元。
标签: ios swift uitableview