在编辑文本字段

时间:2017-01-09 20:46:50

标签: ios swift keyboard uitextfield user-interaction

Swift的新手。

当用户点击文本字段开始输入时,除了键入该文本字段之外,有没有办法禁用所有用户交互?我想要它,以便用户无法在文本字段外单击,并应按返回键以关闭键盘,再次启用用户交互(我已设置关闭键盘部分)。

我知道isUserInteractionEnabled函数可以停止所有交互,但我仍然希望用户能够与键盘进行交互。

由于

2 个答案:

答案 0 :(得分:1)

所以,我想到的第一个想法就是在你专注于UITextField实例的同时禁用你的视图中的每个UI元素。

创建一个函数,它将获取一个UI元素作为参数(对于ex的UITextField)。在函数体中开始检查每个UI元素并循环禁用所有人,这将不等于传递的参数。 您可以另外验证文本字段中的类型和文本。

这是函数正文的草稿:

func disableAll(exceptInput element: UITextField) {
    for item in self.view.subviews {
        if item != element {
            item.isUserInteractionEnabled = false
        } else {
            item.isUserInteractionEnabled = true
        }
    }
}

并在文本字段操作中执行此方法,例如。在onDidStart

显然,不要忘记为用户交互启用所有元素。代码很简单:

func enableAll() {
    for item in self.view.subviews {
        item.isUserInteractionEnabled = true
    }
} 

您可以在每个UITextField的onDidEnd IBAction上执行此方法。如果要运行正常的应用程序行为,则最后一步是必需的。

答案 1 :(得分:0)

您描述的行为可以通过在UI元素处理布尔isEnabled值来完成。有几个步骤可以使这个流畅且用户友好。

这是一个很好的练习,并不是本例所必需的,但我喜欢扩展MyViewController,订阅/取消订阅键盘通知等等,如下所示:

import Foundation
import UIKit

extension MyViewController {            

    //MARK: Subscribing/Unsubribing to NotificationCenter.
    func subcribeToKeyboardNotifications(){    
         NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
         NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }

    func unsubscribeToKeyboardNotifications(){
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }

    //MARK: Screen manipulation methods, to move the UIView up when the bottom text field is editing.
    func keyboardWillShow(_ notification: Notification) {
        if bottomTextField.isEditing {
            view.frame.origin.y =  getKeyboardHeight(notification) * -1
        }
    }

    func keyboardWillHide(_ notification: Notification) {
        if bottomTextField.isEditing {
            view.frame.origin.y = 0
        }
    }

    //MARK: Value returning method to calculate keyboard height.
    private func getKeyboardHeight(_ notification: Notification) -> CGFloat {
        let userInfo = (notification as NSNotification).userInfo!
        let keyboardSize = userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue
        return keyboardSize.cgRectValue.height
    } 
}

接下来,在MyViewController中,我点击返回键时将键盘设置为resignToFirstResponder(),并确保设置UITextFieldDelegates

import Foundation
import UIKit

class MyViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var someButton: UIButton!
    @IBOutlet weak var topTextField: UITextField!
    @IBOutlet weak var bottomTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        //Set the delegates to self, it this example.
        topTextField.delegate = self
        bottomTextField.delegate = self
        enableUIElements(true)
    }

    //Delegate function to type stuff into the text field.
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        enableUIElements(false)
        var newText = textField.text! as NSString
        newText = newText.replacingCharacters(in: range, with: string) as NSString
        let textSize: CGSize = newText.size(attributes: [NSFontAttributeName: textField.font!])
        return textSize.width < textField.bounds.size.width
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder() //Dismiss the keyboard.
        enableUIElements(true) //enable the UI elements.
        return true
    }

    //Create a function to enable/disable UI elements.
    func enableUIElements(_ enable: Bool){
        someButton.isEnabled = enable
        //TODO: add other elements here.
    }
}

注意最后一个功能!如我所示,使用它在键盘处于活动状态时启用/禁用其他元素。

那应该让你到达你需要去的地方:)。