Swift的新手。
当用户点击文本字段开始输入时,除了键入该文本字段之外,有没有办法禁用所有用户交互?我想要它,以便用户无法在文本字段外单击,并应按返回键以关闭键盘,再次启用用户交互(我已设置关闭键盘部分)。
我知道isUserInteractionEnabled函数可以停止所有交互,但我仍然希望用户能够与键盘进行交互。
由于
答案 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.
}
}
注意最后一个功能!如我所示,使用它在键盘处于活动状态时启用/禁用其他元素。
那应该让你到达你需要去的地方:)。