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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:24:11