Swift - Получить ввод с клавиатуры, когда пользователь печатает

У меня есть приложение в быстром, где текстовое поле находится в нижней части экрана, и когда пользователь пытается что-то набрать, клавиатура закрывает текстовое поле, поэтому пользователь не может видеть, что он / она печатает. Чтобы решить эту проблему, я хотел бы получить ввод с клавиатуры от пользователя с каждым штрихом /"типом" (каждый раз, когда пользователь нажимает клавишу), а затем отобразить его на виде, который расположен чуть выше клавиатуры. Если это невозможно или очень сложно, вы можете предложить альтернативные решения.

4 ответа

Решение

Вам нужно зарегистрироваться в качестве наблюдателя для уведомлений, чтобы увидеть, когда клавиатура появляется и исчезает. Затем вы могли бы переместить свой вид вверх на шоу или восстановить его в исходное при скрытии.

Моя реализация перемещает весь вид вверх на высоту клавиатуры, но если вы хотите, вы можете просто переместить UITextField вверх.

Вы можете взглянуть на этот учебник или увидеть мою реализацию в ответе:

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

Добавить наблюдателей в viewDidAppear

override func viewWillAppear(animated:Bool) {
    super.viewWillAppear(animated)

    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name: UIKeyboardWillHideNotification, object: nil)
}

Затем вам нужны методы, чтобы переместить представление в keyboardWillShow а также keyboardWillHide новые методы.

func keyboardWillShow(notification: NSNotification) {
    var info:NSDictionary = notification.userInfo!
    var keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as NSValue).CGRectValue()

    var keyboardHeight:CGFloat = keyboardSize.height

    var animationDuration:CGFloat = info[UIKeyboardAnimationDurationUserInfoKey] as CGFloat

    UIView.animateWithDuration(0.25, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations: {
        self.view.transform = CGAffineTransformMakeTranslation(0, -keyboardHeight)
        }, completion: nil)

}

И перевести вид в исходное состояние:

func keyboardWillHide(notification: NSNotification) {
    var info:NSDictionary = notification.userInfo!
    var keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as NSValue).CGRectValue()

    var keyboardHeight:CGFloat = keyboardSize.height

    var animationDuration:CGFloat = info[UIKeyboardAnimationDurationUserInfoKey] as CGFloat

    UIView.animateWithDuration(0.25, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations: {
        self.view.transform = CGAffineTransformIdentity
        }, completion: nil)
}

И в конце удалите наблюдателя в viewDidDisappear

override func viewWillDisappear(animated: Bool) {
 super.viewWillDisappear(animated)

 NSNotificationCenter.defaultCenter().removeObserver(self)
}

Вот как я справился с этой проблемой. Я надеюсь, что этот метод решит вашу проблему.

Это текстовое поле, которое вы хотите использовать.

@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;
}

Я надеюсь, что это полезно для вас.

Чтобы согласиться с ответом Стефана Салатика, я использую следующий код, поскольку клавиатура часто по-прежнему покрывает текстовое поле.

-(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];
}

Хотя Ответ Стефана лучше для вашей текущей реализации. Ваш вопрос был о том, как получить каждый удар, который печатает пользователь.

Ради завершения

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 может использоваться, чтобы увидеть, что является последним пользовательским вводом. Вы можете сохранить локальную переменную с текущим значением и сравнить ее с "новым" значением, чтобы увидеть, что было изменено.

Другие вопросы по тегам