Swift 3:如何解析数据并在跳转后的TableViewController中展示
嘿,新手朋友别担心,刚入门iOS开发遇到问题太正常了!先把你的需求和常见卡点梳理清楚,给你一些针对性的实用建议:
我的iOS应用开发需求与问题
我是iOS应用开发新手,若我的代码不够优化或书写不规范,在此提前致歉。我正尝试开发一款仅用于获取和展示数据的简易应用,但遇到了一个困扰我数日的问题,急需帮助。应用的整体功能如下:
- 启动后显示带输入框(用于输入用户名)和按钮的ViewController
- 用户输入用户名并点击按钮后,应用应发起网络请求获取该用户的相关数据,之后跳转到新的ViewController展示这些数据
常见问题排查与解决方案
假设你遇到的是点击按钮无响应、网络请求失败、数据无法传递到下一个页面这类典型问题,给你一步步的解决思路:
1. 按钮点击事件绑定检查
首先确保按钮的点击逻辑已经正确关联:
- 如果你用Storyboard/XIB:检查按钮的
Touch Up Inside事件是否拖线到ViewController的对应方法,方法签名要准确,比如:
@IBAction func fetchDataButtonTapped(_ sender: UIButton) { // 你的点击逻辑代码 }
- 如果你用纯代码创建按钮:记得添加点击事件监听:
fetchButton.addTarget(self, action: #selector(fetchDataButtonTapped), for: .touchUpInside)
2. 输入框内容获取与校验
点击按钮后先获取输入框文本,一定要做非空校验,避免无效请求:
guard let username = usernameTextField.text, !username.isEmpty else { // 提示用户输入用户名 let alert = UIAlertController(title: "提示", message: "请输入用户名", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) present(alert, animated: true) return }
3. 网络请求的正确实现
发起网络请求时,要在后台线程执行,请求完成后切回主线程更新UI(避免卡顿):
用URLSession实现的示例代码:
// 先定义匹配API返回的User模型 struct User: Codable { let id: Int let name: String let email: String // 其他你需要的字段 } func fetchUserData(for username: String) { guard let url = URL(string: "你的API地址?username=\(username)") else { print("无效的URL地址") return } let task = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in guard let self = self else { return } // 处理请求错误 if let error = error { print("请求失败:\(error.localizedDescription)") DispatchQueue.main.async { let alert = UIAlertController(title: "错误", message: "获取数据失败,请稍后重试", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) self.present(alert, animated: true) } return } guard let data = data else { print("未获取到返回数据") return } // 解析JSON数据 do { let userData = try JSONDecoder().decode(User.self, from: data) // 切回主线程跳转页面 DispatchQueue.main.async { let detailVC = UserDetailViewController() detailVC.userData = userData self.navigationController?.pushViewController(detailVC, animated: true) } } catch { print("数据解析失败:\(error.localizedDescription)") DispatchQueue.main.async { let alert = UIAlertController(title: "错误", message: "数据解析失败", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) self.present(alert, animated: true) } } } task.resume() }
4. 页面跳转与数据传递
- 纯代码跳转:像上面示例那样,初始化目标ViewController后直接赋值数据再push即可
- Storyboard跳转:先给segue设置唯一的identifier,然后在
prepare(for:sender:)方法中传递数据:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "ShowUserDetail" { let detailVC = segue.destination as! UserDetailViewController detailVC.userData = self.fetchedUserData // 这里传入你获取到的用户数据 } }
5. 新手易踩坑点提醒
- 别忘了给初始ViewController嵌入
UINavigationController,否则pushViewController会无效 - 如果请求的是HTTP地址,需要在
Info.plist中配置ATS(添加NSAppTransportSecurity字典并设置NSAllowsArbitraryLoads为YES,建议优先用HTTPS) - 网络请求闭包中用
[weak self]避免循环引用,防止内存泄漏
内容的提问来源于stack exchange,提问作者Gregor Cerinšek
相关产品推荐
相关产品推荐

