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

Swift开发:点击单个按钮实现多UITextField焦点切换

实现UITextField间焦点切换

需求

点击"proximo"按钮时,在15个UITextField之间按顺序切换焦点,例如当前编辑0.01对应的输入框时,点击按钮即可切换到0.02对应的输入框进行编辑。

实现方案

步骤1:定义输入框顺序数组

在视图控制器中,将所有UITextField按需要的切换顺序存入数组,以此快速定位下一个要聚焦的输入框。

步骤2:实现按钮点击的焦点切换逻辑

获取当前正在编辑的输入框,找到它在数组中的位置,让下一个输入框成为第一响应者;如果没有输入框处于编辑状态,默认聚焦第一个输入框。

完整代码

// 定义存储输入框顺序的数组
private var textFieldsOrder: [UITextField] = []

override func viewDidLoad() {
    super.viewDidLoad()
    // 按面额从小到大的顺序初始化数组,确保和需求的切换顺序一致
    textFieldsOrder = [umCent, doisCent, cincoCent, dezCent, vinteCent, cinquentaCent, umEuro, doisEuro, cincoEuro, dezEuro, vinteEuro, cinquentaEuro, cemEuro, duzentosEuro, quinhentosEuro]
}

@IBOutlet weak var umCent: UITextField!
@IBOutlet weak var doisCent: UITextField!
@IBOutlet weak var cincoCent: UITextField!
@IBOutlet weak var dezCent: UITextField!
@IBOutlet weak var vinteCent: UITextField!
@IBOutlet weak var cinquentaCent: UITextField!
@IBOutlet weak var umEuro: UITextField!
@IBOutlet weak var doisEuro: UITextField!
@IBOutlet weak var cincoEuro: UITextField!
@IBOutlet weak var dezEuro: UITextField!
@IBOutlet weak var vinteEuro: UITextField!
@IBOutlet weak var cinquentaEuro: UITextField!
@IBOutlet weak var cemEuro: UITextField!
@IBOutlet weak var duzentosEuro: UITextField!
@IBOutlet weak var quinhentosEuro: UITextField!

@IBAction func proximo(_ sender: UIButton) {
    // 获取当前正在编辑的输入框
    guard let currentTextField = UIResponder.currentFirstResponder as? UITextField,
          let currentIndex = textFieldsOrder.firstIndex(of: currentTextField) else {
        // 无编辑状态时默认聚焦第一个输入框
        textFieldsOrder.first?.becomeFirstResponder()
        return
    }
    
    // 计算下一个输入框的索引,支持循环切换(最后一个切换回第一个)
    let nextIndex = (currentIndex + 1) % textFieldsOrder.count
    textFieldsOrder[nextIndex].becomeFirstResponder()
}

// 扩展UIResponder,快速获取当前第一响应者
extension UIResponder {
    static var currentFirstResponder: UIResponder? {
        _currentFirstResponder = nil
        UIApplication.shared.sendAction(#selector(findFirstResponder(_:)), to: nil, from: nil, for: nil)
        return _currentFirstResponder
    }
    
    private static weak var _currentFirstResponder: UIResponder?
    
    @objc private func findFirstResponder(_ sender: Any) {
        UIResponder._currentFirstResponder = self
    }
}

补充说明

  • 数组textFieldsOrder的顺序必须和你期望的焦点切换顺序完全匹配,可根据需求调整顺序。
  • 扩展UIResponder的作用是简化获取当前编辑输入框的逻辑,无需逐个判断每个输入框是否为第一响应者。
  • 如果需要支持反向切换(比如添加“上一个”按钮),只需将nextIndex的计算改为(currentIndex - 1 + textFieldsOrder.count) % textFieldsOrder.count即可。

内容的提问来源于stack exchange,提问作者Fbio Carlos Henriques da Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:27:21