Swift 3:如何提取JSON元素并与TextField内容比对实现视图跳转
嘿,我来帮你搞定这个Swift 3里的需求!提取JSON特定元素、和TextField输入比对再跳转视图,其实流程很清晰,我给你拆解成步骤并附上可直接用的代码示例:
步骤1:明确JSON结构并完成解析
首先你得清楚你的JSON结构,比如假设你要处理的JSON是这样的(可能来自接口或者本地文件):
{ "authorizedUsers": ["alice@test.com", "bob@test.com"], "superAdmin": "admin@test.com" }
在Swift 3里,我们用JSONSerialization来解析JSON,记得用do-catch处理解析可能出现的错误。
步骤2:提取目标元素并与TextField输入比对
首先要获取用户在txtEmail里的输入,一定要先解包可选值,因为txtEmail.text是String?类型,直接使用会有崩溃风险。然后把提取到的JSON元素和输入做比对。
步骤3:根据比对结果跳转视图
根据比对结果,我们可以用导航控制器的pushViewController或者直接present来跳转不同的视图控制器,具体取决于你的项目视图结构。
完整代码示例(按钮点击事件里的完整流程)
假设你有一个“验证邮箱”的按钮,点击后执行以下逻辑:
// 先确保已经正确连接TextField的IBOutlet @IBOutlet weak var txtEmail: UITextField! @IBAction func verifyAndNavigate(_ sender: UIButton) { // 1. 获取并验证用户输入 guard let inputEmail = txtEmail.text, !inputEmail.trimmingCharacters(in: .whitespaces).isEmpty else { // 提示用户输入有效邮箱 let alert = UIAlertController(title: "提示", message: "请输入有效的邮箱地址", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "好的", style: .default)) present(alert, animated: true) return } // 2. 解析JSON(这里用本地字符串模拟,实际可以换成网络请求的Data) let sampleJSON = """ { "authorizedUsers": ["alice@test.com", "bob@test.com"], "superAdmin": "admin@test.com" } """ guard let jsonData = sampleJSON.data(using: .utf8) else { print("JSON转Data失败") return } do { guard let jsonDict = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] else { print("JSON格式不符合预期") return } // 3. 提取JSON里的特定元素 guard let authorizedEmails = jsonDict["authorizedUsers"] as? [String], let adminEmail = jsonDict["superAdmin"] as? String else { print("无法提取目标邮箱数据") return } // 4. 比对输入并跳转视图 let normalizedInput = inputEmail.lowercased() // 统一小写,避免大小写差异导致比对失败 let normalizedAdmin = adminEmail.lowercased() if normalizedInput == normalizedAdmin { // 跳转到管理员视图 if let adminVC = storyboard?.instantiateViewController(withIdentifier: "AdminViewController") as? AdminViewController { navigationController?.pushViewController(adminVC, animated: true) } } else if authorizedEmails.contains(where: { $0.lowercased() == normalizedInput }) { // 跳转到普通用户视图 if let userVC = storyboard?.instantiateViewController(withIdentifier: "UserViewController") as? UserViewController { navigationController?.pushViewController(userVC, animated: true) } } else { // 邮箱未授权,提示用户 let alert = UIAlertController(title: "访问受限", message: "该邮箱未获得访问权限,请联系管理员", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) present(alert, animated: true) } } catch { print("JSON解析出错:\(error.localizedDescription)") } }
几个关键注意点
- 如果你的视图控制器是通过Storyboard创建的,记得在Storyboard里给对应的VC设置Storyboard ID(比如上面的
AdminViewController),否则instantiateViewController会失败 - 如果是从网络获取JSON,用
URLSession发起请求,拿到返回的Data后再传入JSONSerialization解析就行,逻辑和示例一致 - 比对邮箱时统一转成小写(或者大写)可以避免用户输入大小写不一致导致的比对错误,提升用户体验
内容的提问来源于stack exchange,提问作者Netox
相关产品推荐
相关产品推荐

