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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:56:16