2014-01-12 44 views
27

我有一個包含UITextField和UITextView的滾動視圖。 UITextField返回鍵是「Next」,當按下時,我調用[myTextView becomeFirstResponder];隨機新行插入到我的文本視圖,所以我開始在第二行。我如何避免這種情況?UITextView無意中添加新行嗎?

同樣重要的是要注意,當我直接點擊UITextView而不是點擊下一個鍵時,不會發生這種情況。

提前致謝!

+0

這將使事情變得更好,如果你分享一些代碼。你確定你沒有設置一些東西到textView.text屬性...? –

+0

這是全部在界面生成器中創建的,所以我沒有任何東西可以共享。我目前在我的實現文件中沒有代碼 – Stephen

+1

你說你沒有代碼,但你的問題表明你調用'[myTextView becomeFirstResponder];'。這是一個矛盾。你顯然有代碼。 – rmaddy

回答

61

一種解決辦法是,當你實現textFieldShouldReturn:委託方法時,一定要返回NO,而不是YES。通過返回NO,換行符不會傳遞到文本字段。

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

    return NO; 
} 
+1

這兩個工作如何對今天在這裏每個人upvote :) – 2014-01-30 22:59:18

+0

太棒了!這個真的有用!謝謝! textFieldShouldReturn YES實際上是通過了換行符。沒有,它沒有。 –

10

好的,這種行爲是由於在使用下一個按鈕在同一個運行循環中成爲firstresponder時iOS中的一個錯誤。爲了解決這個問題,你應該手動完成。 首先從textFied中退出第一響應者,然後將textView作爲第一響應者。喜歡這個。實現這個委託方法。要解決這個

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

沒有必要這樣做。看到我的答案。 – rmaddy

+1

這兩個工作如何今天在這裏每個人的upvote :) – 2014-01-30 22:58:57

+0

它的偉大... :) –

-1

類似想法performSelector,但使用異步調度隊列(斯威夫特第4版):

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    textField.resignFirstResponder() 
    DispatchQueue.main.async { 
     self.myTextView.becomeFirstResponder() 
    } 
    return true 
}