Swift - 在用户输入时获取键盘输入

Swift - Get keyboard input as the user is typing

我在 swift 中有一个应用程序,其中 texfield 位于屏幕底部,当用户尝试键入任何内容时,键盘会覆盖文本字段,因此用户无法看到he/she 正在输入什么。为了解决这个问题,我想从用户那里获取键盘输入,每笔划/"type"(每次用户按下一个键),然后将其显示到位于键盘正上方的视图上。如果这是不可能的,或者非常复杂,我们非常欢迎您提出替代解决方案。

您需要注册为观察者才能收到通知,以查看键盘何时出现和消失。然后你会在显示时向上移动你的视图,或者在隐藏时将它恢复到原来的状态。

我的实现将整个视图向上移动了键盘高度,但如果您愿意,可以将 UITextField 向上移动。

你可以看看这个教程,或者看我在回答中的实现:

http://www.ioscreator.com/tutorials/move-view-behind-keyboard-ios8-swift

viewDidAppear

中添加观察员
override func viewWillAppear(animated:Bool) {
    super.viewWillAppear(animated)

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
}

然后您需要在 keyboardWillShowkeyboardWillHide 新方法中移动视图的方法。

@objc func keyboardWillShow(_ notification: NSNotification) {
    let info = notification.userInfo!
    let keyboardSize = (info[UIResponder.keyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue

    let keyboardHeight:CGFloat = keyboardSize.height

    //let animationDuration:CGFloat = info[UIResponder.keyboardAnimationDurationUserInfoKey] as! CGFloat

    UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseInOut, animations: {
        self.view.transform = CGAffineTransform(translationX: 0, y: -keyboardHeight)
        }, completion: nil)

}

并将视图移动到原始状态:

@objc func keyboardWillHide(_ notification: NSNotification) {
    UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseInOut, animations: {
        self.view.transform = CGAffineTransform.identity
        }, completion: nil)
}

最后移除 viewDidDisappear

中的观察者
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    NotificationCenter.default.removeObserver(self)
}

为了配合 Stefan Salatics 的回答,我使用了以下代码,因为键盘通常仍会覆盖文本字段。

-(void) keyboardWillShow:(NSNotification *)note
{
// Get the keyboard size
CGRect keyboardBounds;
[[note.userInfo valueForKey:UIKeyboardFrameBeginUserInfoKey] getValue: &keyboardBounds];

// Start animation
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.3f];


// Get Keyboard height and subtract the screen height by the origin of the textbox and height of text box to position textbox right above keyboard
self.scrollView.contentOffset = CGPointMake(0,keyboardBounds.size.height-([UIScreen mainScreen].bounds.size.height - commentBox.frame.origin.y - commentBox.frame.size.height));

[UIView commitAnimations];
}

虽然 Stefan 的答案更适合您当前的实施。你的问题是如何获取用户输入的每一个笔划。

为了完成

class viewController: UIViewController, UITextFieldDelegate{    
    var textField = UITextField()

    override func viewDidLoad() {
        textField.delegate = self
    }

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        //string is used here as the value of the textField.
        //This will be called after every user input in the textField
    }
}

string可以用来查看最新的用户输入是什么。您可以使用当前值存储局部变量,并将其与“新”值进行比较以查看已更改的内容。

以下是我对那个问题的处理方法。希望这个方法能解决你的问题。

这是您要使用的文本字段。

@IBOutlet var userID : UITextField!

你需要写这个函数。

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

在你想要的功能中,你需要写这个语法。

@IBAction func login(sender: AnyObject)
{
    userID.resignFirstResponder( )
}

这是在 ViewDidLoad 或 ViewDidAppear 中

override func viewDidLoad( )
{
    userID.delegate = self;
}

希望对你有用。