Swift中如何通过UIButton动作添加多个可拖拽的UITextField
解决点击按钮创建多个可拖拽UITextField的问题
嘿,问题很清晰啦——你现在用lazy var定义的editableTextField只会被初始化一次,所以每次点击按钮都是把同一个文本框重复添加到视图上,自然看不到新的文本框出现。咱们改改代码,让每次点击按钮都生成一个全新的可拖拽UITextField:
修改后的完整代码示例
class YourViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 这里可以先配置你的handleTextButton按钮(比如设置位置、添加到视图) } @objc func handleTextButton(){ print("text button clicked") // 每次点击都创建全新的UITextField实例 let newTextField = UITextField() newTextField.isUserInteractionEnabled = true newTextField.translatesAutoresizingMaskIntoConstraints = false newTextField.returnKeyType = .done newTextField.borderStyle = .roundedRect // 加边框方便识别文本框 newTextField.placeholder = "输入内容..." // 给新文本框绑定拖拽手势 let panGesture = UIPanGestureRecognizer(target: self, action: #selector(userDragged(_:))) newTextField.addGestureRecognizer(panGesture) // 将新文本框添加到视图 view.addSubview(newTextField) // 设置初始位置与大小约束(示例为屏幕中心,宽200高40) NSLayoutConstraint.activate([ newTextField.centerXAnchor.constraint(equalTo: view.centerXAnchor), newTextField.centerYAnchor.constraint(equalTo: view.centerYAnchor), newTextField.widthAnchor.constraint(equalToConstant: 200), newTextField.heightAnchor.constraint(equalToConstant: 40) ]) // 监听return键,点击后收起键盘 newTextField.addTarget(self, action: #selector(textFieldDoneEditing(_:)), for: .editingDidEndOnExit) } @objc func userDragged(_ gesture: UIPanGestureRecognizer){ guard let textField = gesture.view as? UITextField else { return } let translation = gesture.translation(in: view) // 更新文本框的中心位置 textField.center = CGPoint(x: textField.center.x + translation.x, y: textField.center.y + translation.y) // 重置手势偏移量,避免拖拽时位置累积 gesture.setTranslation(.zero, in: view) } @objc func textFieldDoneEditing(_ textField: UITextField){ textField.resignFirstResponder() } }
关键修改点说明
- 移除单一实例复用:不再用
lazy var固定一个UITextField,而是每次点击按钮都创建新实例,确保生成多个独立的文本框。 - 每个文本框绑定独立手势:给每个新生成的文本框单独添加拖拽手势,保证拖拽操作只作用于当前被选中的文本框。
- 初始约束配置:给每个新文本框设置默认位置和大小,避免所有文本框重叠在同一位置。
- 键盘收起处理:添加
editingDidEndOnExit监听,点击return键可收起键盘,优化输入体验。
这样修改后,每次点击handleTextButton按钮,都会在屏幕上生成一个新的可拖拽UITextField,每个文本框都能独立拖拽和输入内容啦!
内容的提问来源于stack exchange,提问作者Selahattin Çinçin
相关产品推荐
相关产品推荐

