2009-12-01 62 views
1

我正在開發一個需要多行文本字段(UITextView)捕獲一些文本的iPhone應用程序。UITextView沒有事件

當用戶觸摸textView內部時,它變成firstResponder並顯示鍵盤。我真正需要做的是在用戶完成時移除鍵盤。通常在文本字段中,返回/完成按鈕按下將指示打字結束,我將使用委託來辭退第一響應者。但是,對於多行textview,我希望用戶能夠添加一個新行,這是不可能的。

我的下一個選擇是退出第一個響應者,如果在文本視圖之外有觸摸。這裏的問題是在UITextView上沒有聲明我可以在界面構建器中看到的事件。

如何在iPhone應用程序中創建多行文本字段,並在合理的時間釋放第一響應者?

回答

3

您可以使用完成按鈕導航欄上:

- (void)viewDidLoad { 
     [super viewDidLoad]; 
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneAction:)]; 
} 

駁回鍵盤,用類似處理該事件:

- (void) doneAction: (id) sender{ [textView resignFirstResponder]; } 

(記住.h文件聲明)

3

我猜你正在感嘆鍵盤上的「丟失」完成按鈕,這是在多行UItextView上返回的,糾正我,如果我錯了。

最明顯的方法似乎有你的界面,辭職第一響應另一個按鈕。

我不認爲一些聰明的代碼隱藏鍵盤在某些事件將是非常直觀的使用。

Apple Notes應用程序使用其右上角完成按鈕來辭退第一響應者,這種方法似乎是合理的。

0

如果你是完全在具有鍵盤上的「完成」鍵設置,我使用的方法是檢查的最後一個字符中的UITextView時的內容變化。如果最後一個字符是新行,那麼用戶已經完成了按鈕。我想第二個尼爾認爲應該有另一個按鈕,但有時客戶得到了客戶想要的。

很明顯,你必須設置委託的UITextView的指向在該方法中居住類。 - (void)textViewDidChange:(UITextView *)inTextView方法是UITextViewDelegate協議的一部分。

- (void)textViewDidChange:(UITextView *)inTextView { 
NSString *text = inTextView.text; 

if ([text length] > 0 && [text characterAtIndex:[text length] -1] == '\n') { 
    message = [text substringToIndex:[text length] -1]; 
    [delegate messageEdited]; 
    [self removeFromSuperview]; 
} 

}

1
//If user touches outside of the keypad, then the keypad will go away 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
     UITouch *touch = [[event allTouches] anyObject]; 
     if (touch.tapCount >= 1) { 
      [ZLabel resignFirstResponder]; 

     } 
    } 
0
  • (BOOL)的TextView:(UITextView的*)的TextView shouldChangeTextInRange:(NSRange)範圍replacementText:(的NSString *)文本{

    [txtView resignFirstResponder]; 
    

    返回YES; }

1

您可以創建一個不可見的按鈕,它覆蓋了所有屏幕,並向其添加方法。我認爲這樣會有效。

- (IBAction)backgroundClick:(id)sender{ 
    [textView resignFirstResponder]; 
}