【问题标题】:Change 'Return' button function to 'Done' in swift in UITextView在 UITextView 中快速将“返回”按钮功能更改为“完成”
【发布时间】:2015-08-07 21:12:06
【问题描述】:

我想在用户打字时摆脱键盘的“返回”功能,所以没有新行,所以我希望“返回”键起到“完成”的作用,所以它会隐藏键盘。

我使用的是可编辑的 UITextView,因此用户可以键入他们的帖子,并将其发布到主时间轴,但由于我有固定单元格,我不希望用户能够按下'return' 并且他们的帖子将超出时间线的范围。

我发现这适用于 UITextField,但不适用于 UITextView:

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    textField.resignFirstResponder()  //if desired
    return true
}

所以我只是想知道是否有办法在 UITextView 中做到这一点,或者至少能够在按下回车时隐藏键盘,而不是创建新行。

【问题讨论】:

    标签: ios iphone swift cocoa-touch


    【解决方案1】:

    可以设置文本字段的返回键类型:

    textField.returnKeyType = UIReturnKeyType.done
    

    更新 如上所述,您绝对可以使用相同的方法将返回键设置为“完成”。但是,当用户点击返回键时,UITextView 不提供回调。作为一种解决方法,您可以尝试处理 textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) 委托调用,并在检测到换行符的输入时关闭键盘:

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if (text == "\n") {
            textView.resignFirstResponder()
        }
        return true
    }
    

    【讨论】:

    • 这取代了“返回”按钮隐藏键盘的功能。它不再发布任何新行。谢谢!
    • shouldChangeTextInRange 中的代码只有在用户一次输入一个字符时才会起作用。如果用户粘贴多行文本,它将失败。
    • @utogaria UITextView 委托将如何被调用 UITextField ?
    • 小调整:如果输入了新行,如果您不想存储新行,则返回 false
    【解决方案2】:

    我尝试了很多代码,最后在 Swift 3.0 最新 [2019 年 4 月] 中对我有用,这是使用 UITextFields 实现的

    “ViewController”类应继承“UITextFieldDelegate”以使此代码正常工作。

    class ViewController: UIViewController,UITextFieldDelegate  
    

    添加带有正确标记号的文本字段,此标记号用于根据分配给它的增量标记号将控制权转移到适当的文本字段。

    override func viewDidLoad() {
    
        userNameTextField.delegate = self
        userNameTextField.tag = 0
        userNameTextField.returnKeyType = .next
        passwordTextField.delegate = self
        passwordTextField.tag = 1
        passwordTextField.returnKeyType = .go
    }
    

    在上面的代码中,“returnKeyType = UIReturnKeyType.next”将使键盘返回键显示为“Next”,您还可以选择其他选项,如“Join/Go”等,根据您的应用程序更改值.

    这个“textFieldShouldReturn”是一个由 UITextFieldDelegate 控制的方法,这里我们有基于标签值增量的下一个字段选择。

    func textFieldShouldReturn(_ textField: UITextField) -> Bool
    {
        if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField {
            nextField.becomeFirstResponder()
        } else {
            textField.resignFirstResponder()
            return true;
        }
        return false
    }
    

    【讨论】:

    • @Sanf0rd:我很欣赏并同意您删除“UIReturnKeyType”类名并仅用作“.go”或“.next”的编辑,因为它们是静态属性。我明确地用来帮助读者了解我们使用的那个类“UIReturnKeyType”,这样他们就可以去检查类中其他可用的属性选项[google、yahoo、send、emergencyCall 等...]。可以吗,还是您觉得要删除类名。
    • 这个答案是针对 UITextFields,但问题是关于 UITextView
    • 是的,这是仅使用 UITextFields 实现的,这是我尝试过并正在工作的替代选项。
    【解决方案3】:

    如果您正在使用情节提要或 xib,您可以在 Interface Builder 中将 UITextView's Return 按钮更改为“完成”(或各种其他选项),而无需任何设置代码。只需在 属性检查器 中查找此选项:

    从那里,您只需将其与其他人已在此处提供的 UITextViewDelegate 代码配对即可。

    Swift v5:

    extension ExampleViewController: UITextViewDelegate {
    
        func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
            if (text == "\n") {
                textView.resignFirstResponder()
            }
            return true
        }
    }
    

    然后,在您的 viewDidLoad() 方法中:

    exampleTextView.delegate = self

    【讨论】:

    • 如果您的 textView 是程序化使用:yourTextView.returnKeyType = .done。您可以将其添加到 viewDidLoad
    【解决方案4】:

    在 Swift 4 中工作

    在 viewDidLoad() 中添加这个。

    textField.returnKeyType = UIReturnKeyType.Done
    

    添加到任何你喜欢的地方。

    extension UITextView: UITextViewDelegate {
        public func textViewDidChange(_ textView: UITextView) {
            if text.last == "\n" { //Check if last char is newline
                text.removeLast() //Remove newline
                textView.resignFirstResponder() //Dismiss keyboard
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 2011-06-09
      • 2011-05-11
      • 2021-08-10
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多