2014-01-12 4 views
27

У меня есть вид прокрутки, который содержит UITextField и UITextView. Возвращаемый ключ UITextField - «Далее», и когда он нажимается, я вызываю [myTextView getFirstResponder]; Случайная новая строка вставляется в мое текстовое представление, поэтому я начинаю со второй строки. Как мне избежать этого?UITextView добавляет новую строку непреднамеренно?

Также важно отметить, что этого не происходит, когда я нажимаю непосредственно на UITextView, а не нажимаю следующий ключ.

Заранее благодарен!

+0

Это сделает вещи намного лучше, если вы разделяете код. И вы уверены, что не задаете какое-либо свойство textView.text ...? –

+0

Все это создано в построителе интерфейса, поэтому мне нечего делиться. У меня нет кода в моих файлах реализации в настоящее время – Stephen

+1

Вы говорите, что у вас нет кода, но в вашем вопросе говорится, что вы вызываете '[myTextView getFirstResponder];'. Это противоречие. У вас, очевидно, есть код. – rmaddy

ответ

61

Одно решение, чтобы решить это при реализации метода textFieldShouldReturn: делегата, не забудьте вернуть NO и не YES. Возвращая NO, новая строка не передается в текстовое поле.

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    // move to next field or whatever you need 
    [myTextView becomeFirstResponder]; 

    return NO; 
} 
+1

Оба работают, как о повышении для всех здесь сегодня :) –

+0

Awesome! Это действительно работает! Благодаря! textFieldShouldReturn YES фактически передает новую строку. С НЕТ это не так. –

10

Хорошо, это происходит из-за ошибки в iOS, когда вы становитесь первым ответчиком в пределах одного цикла запуска, используя следующую кнопку. Чтобы это произошло, вы должны сделать это вручную. Сначала отставьте первого ответчика от textFied, а затем сделайте textView в качестве первого ответчика. как это. Внедрите этот метод делегата.

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
[textField resignFirstResponder]; 
[textView performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0]; 
return YES; 
} 
+0

Нет необходимости делать это. См. Мой ответ. – rmaddy

+1

Оба работают, как о повышении для всех здесь сегодня :) –

+0

Его отличная ... :) –

-1

Похожая идея для performSelector, но с использованием асинхронной очереди отправки (Swift 4 версии):

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    textField.resignFirstResponder() 
    DispatchQueue.main.async { 
     self.myTextView.becomeFirstResponder() 
    } 
    return true 
} 
Смежные вопросы