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
相关产品推荐
相关产品推荐

