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
相关产品推荐
相关产品推荐

