You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS UITableView无法展示GitHub API返回的用户数据问题求助

问题排查与修复方案

1. 验证网络请求与解析是否正常

GitHub公开API要求请求必须携带User-Agent请求头,否则会直接返回403错误,这是最常见的请求失败原因。你可以先查看Xcode控制台的打印内容,如果没有输出用户数量、也没有打印CALLED,就说明请求或解析失败了。
修改Network类的请求方法:

func network() {
    let url = "https://api.github.com/users"
    if let requestUrl = URL(string: url) {
        var request = URLRequest(url: requestUrl)
        // 必须添加User-Agent头,否则GitHub API会拒绝请求
        request.setValue("iOS_GitHub_Demo/1.0", forHTTPHeaderField: "User-Agent")
        URLSession.shared.dataTask(with: request) { result, response, error in
            // 打印状态码可快速判断请求是否成功
            if let httpRes = response as? HTTPURLResponse {
                print("请求状态码:\(httpRes.statusCode)")
            }
            if let data = result {
                self.users = self.parseJSON(data)
                print("解析到的用户数量:\(self.users?.count ?? 0)")
                self.delegate?.updateTableView()
            } else {
                print("请求错误:\(error!.localizedDescription)")
            }
        }
        .resume()
    }
}

2. 检查自定义Cell注册逻辑

使用Xib创建的自定义Cell必须提前给TableView注册,否则复用Cell时会崩溃或返回空,在ViewController的viewDidLoad中添加注册代码:

override func viewDidLoad() {
    super.viewDidLoad()
    network.delegate = self
    usersTableView.dataSource = self
    // 注册Xib自定义Cell,nibName要和你的Xib文件名一致
    usersTableView.register(UINib(nibName: "UserViewCell", bundle: nil), forCellReuseIdentifier: "userCell")
    // 开启自动行高,适配不同内容高度
    usersTableView.rowHeight = UITableView.automaticDimension
    usersTableView.estimatedRowHeight = 80
}

3. 补全Cell数据赋值逻辑

你当前的cellForRowAt方法仅创建了Cell实例,没有将用户数据绑定到Cell的控件上,修改该方法:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    print("CALLED")
    let cell = tableView.dequeueReusableCell(withIdentifier: "userCell", for: indexPath) as! UserViewCell
    guard let user = network.users?[indexPath.row] else { return cell }
    // 以下属性名要和你UserViewCell里定义的IBOutlet对应
    cell.userNameLabel.text = user.login
    // 异步加载头像,生产环境建议使用Kingfisher等第三方图片库处理
    if let avatarUrl = URL(string: user.avatar_url) {
        DispatchQueue.global().async {
            if let imgData = try? Data(contentsOf: avatarUrl) {
                DispatchQueue.main.async {
                    cell.avatarImageView.image = UIImage(data: imgData)
                }
            }
        }
    }
    return cell
}

4. 可选校验项

确认Storyboard/Xib中usersTableView的上下左右约束正确,没有被其他控件遮挡,实际渲染高度不为0。

内容的提问来源于stack exchange,提问作者Aarat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:36:07