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

Swift 5中TextField数据刷新异常及弹窗后无法正常执行闰年计算的问题求助

问题分析与修复方案

嘿,我一眼就揪出问题啦!你的代码逻辑里有个致命的判断错误,这就是为啥弹窗后不管输入啥都一直弹警告的核心原因。

先看你这段代码的逻辑漏洞:

if let text = textField.text {
    if textField.text != nil {
        // 弹警告
    } else {
        // 计算闰年
    }
}

你用if let text = textField.text做了可选绑定,这意味着只有当textField.text不为nil的时候,才会进入这个代码块。然后你又在里面判断textField.text != nil,这个条件永远是true啊!所以不管你输入什么内容(哪怕是有效的年份),程序都会执行弹警告的分支,完全走不到闰年计算的逻辑里。

之前你尝试的resignFirstResponder、调用viewWillAppear都没用,因为根本不是界面刷新或者响应者的问题,是判断逻辑写反了,而且判断条件完全错误。

修复后的代码

我给你调整了逻辑,同时做了一些体验优化:

@IBAction func submitButtonPressed(_ sender: UIButton) {
    // 先收起键盘,提升用户操作体验
    textField.resignFirstResponder()
    
    // 第一步:检查输入是否为空(包括只输入空格的情况)
    guard let inputText = textField.text, !inputText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else {
        self.createAlert(titleField: "Error", messageField: "Please make sure you entered a year before tapping the submit button")
        return
    }
    
    // 第二步:检查输入是否是有效的整数年份
    guard let year = Int(inputText) else {
        self.createAlert(titleField: "Error", messageField: "Please enter a valid number for the year")
        return
    }
    
    // 执行闰年计算(延迟可以保留,若不需要可直接调用)
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
        self.leapYear.calculateYear(year: year, imageView: self.statusView)
    }
}

代码改进点说明

  • 用guard let提前退出的写法,比嵌套if更清晰易读
  • 不仅检查输入是否为空,还处理了只输入空格/换行的无效情况
  • 增加了输入转整数的判断,避免强制解包Int(text)!导致崩溃
  • 先收起键盘,让用户操作更顺畅

这样修改后,你再测试一下:空输入会弹警告,输入非数字会弹格式错误,输入有效年份就会正常执行闰年计算啦。

内容的提问来源于stack exchange,提问作者Kadir Emre Yıldırım

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:07:35