【问题标题】:Using UITextView in UITableViewController - tap outside to dismiss keyboard在 UITableViewController 中使用 UITextView - 点击外部以关闭键盘
【发布时间】:2016-07-13 17:50:02
【问题描述】:

我在表格单元格中使用文本视图。其他单元格与 segues 相关联,因此我需要以下行为:

  1. (默认)点击其他表行会触发相关的segue

  2. 在文本视图内点击开始编辑并显示键盘

  3. 如果键盘可见,则在文本视图之外点击会关闭键盘,但不会跟随 segues

  4. 关闭键盘后,接下来会点击 segues。

【问题讨论】:

    标签: ios swift xcode uitableview uitextview


    【解决方案1】:

    1.采用textView委托方法和

    textView.delegate = self
    

    2。添加全局属性

    var tap = UITapGestureRecognizer()

    3。实现textView 委托方法

    func textViewDidBeginEditing(textField: UITextView) { self.tableView.allowsSelection = false tap = UITapGestureRecognizer(target: self, action: #selector(self.Tapped)) self.view.addGestureRecognizer(tap) }

    func textViewDidEndEditing(textField: UITextView) { self.tableView.allowsSelection = true self.view.removeGestureRecognizer(tap) }

    4.实现 Tapped()

    func Tapped(){ view.endEditing(true) }

    注意:这也适用于 UITextField,将 View 替换为 Field

    【讨论】:

    • 这比我的解决方案更简单,但适用于 UITextField 而不是 UITextView。我认为它可以更改为 View 替换 Field?
    【解决方案2】:

    将 UITextViewDelegate 协议添加到您的类并添加这些变量

    var textViewIsEditing:Bool = false
    var tap: UITapGestureRecognizer!
    

    重写 viewdidload 函数,以便 tableViewController 监听来自文本视图的事件。

    另外添加一个UITapGestureRecognizer,它会触发一个自定义的handleTap函数

    override func viewDidLoad() {
        super.viewDidLoad()
    
        myTextView.delegate = self
    
        tap = UITapGestureRecognizer(target: self, action: #selector(MyClass.handleTap))
        tap.cancelsTouchesInView = false
        self.view.addGestureRecognizer(tap)
    
    }
    

    添加两个函数,根据textview是否正在编辑来切换textViewIsEditing

    func textViewDidEndEditing(textView: UITextView) {
        textViewIsEditing = false
    }
    
    func textViewDidBeginEditing(textView: UITextView) {
        textViewIsEditing = true
    }
    

    现在添加一个自定义的 handleTap 函数来决定如何处理点击:

    func handleTap(thisGestureRecognizer:UITapGestureRecognizer){
    
        if(textFieldIsEditing){
            // ignore this tap if editing text field but end editing
            tap.cancelsTouchesInView = true
            view.endEditing(true)
        }else{
            // proceed as normal
            tap.cancelsTouchesInView = false
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多