2011-10-10 28 views
5

Tôi đang cố triển khai một chương trình trong Xcode, phần nào giống như một dòng lệnh. Về cơ bản tôi có một UITextView có thể lấy nhiều dòng văn bản. Ngay bây giờ, tôi có một nút sẽ thực hiện các thay đổi cần thiết sau khi người dùng nhập lệnh, nhưng tôi muốn có thể có phương thức được gọi sau khi người dùng nhấn phím trả về trong UITextView, về cơ bản nó thay đổi sau mỗi lệnh. có khả năng làm cái này không?Muốn làm cho phản ứng UITextView trả về khóa

+0

Tôi tin rằng đây là câu trả lời bạn đang tìm kiếm: http://stackoverflow.com/questions/4750606/iphone-resign-keyboard-with-done-button-action- with-xib # 4861018 –

+0

Tôi mong bạn thay đổi câu trả lời đã chọn hiện tại vì câu trả lời không chính xác trong nhiều trường hợp. –

Trả lời

6

Nếu bạn đặt một đại biểu đến UITextView mà thực hiện

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 

Sau đó, bạn có thể kiểm tra nếu ký tự cuối cùng là "\ n" và nhận văn bản được nhập từ lệnh cuối cùng bằng cách thực hiện

NSArray* components = [textView.text componentsSeparatedByString:@"\n"]; 
if ([components count] > 0) { 
    NSString* commandText = [components lastObject]; 
    // and optionally clear the text view and hide the keyboard... 
    textView.text = @""; 
    [textView resignFirstResponder]; 
} 
+0

Cảm ơn tất cả các câu trả lời, các bạn. Tôi nghĩ rằng tôi sẽ gắn bó với điều này, mặc dù. – RaysonK

+1

Điều này không cập nhật cho đến khi sau khi một phím khác được nhấn sau khi phím quay lại đã được nhấn. (Nhớ chức năng của bạn là shouldChangeInRange không didChangeInRange. –

-1

Bạn có thể thực hiện việc này bằng cách thiết lập đại biểu cho số UITextView. Xem UITextViewDelegate Protocol Reference để biết chi tiết về những gì có thể được thực hiện.

0

Lưu ý, tôi đã không kiểm tra này, chỉ cần một ý tưởng:

- (void)textViewDidChange:(UITextView *)textView 
{ 
    if ([[textView.text substringWithRange:NSMakeRange(textView.text.length - 1, 1)] isEqualToString:@"\n"]) 
    { 
     [textView resignFirstResponder]; 
     [self methodYouWantToCall]; 
    } 
} 
+1

Bất kỳ phản hồi nào @downvoter? –

20

Phương thức BOOL được đề cập ở trên là một câu trả lời sai ... cho một người đang kiểm tra văn bản từ TextView thời điểm trước khi nó được cập nhật để họ xem văn bản cũ ... Ngoài ra các phương pháp đã lỗi thời. sử dụng này sẽ làm việc ngay khi phím Enter được nhấn (The "câu trả lời" hiện tại sẽ không hoạt động cho đến khi phím Enter đã được ép và sau đó KHÁC phím được nhấn):

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 
    if ([text isEqualToString:@"\n"]) { 
     NSLog(@"Return pressed"); 
    } else { 
     NSLog(@"Other pressed"); 
    } 
    return YES; 
} 

Đừng quên thêm số UITextViewDelegate vào các giao thức của tệp .h.

@interface ViewController : UIViewController <UITextViewDelegate> { 

và đặt yourTextView.delegate = self; trong tệp .m!


/* 
note: This will also get called if a user copy-pastes just a line-break... 
unlikely but possible. If you need to ignore pasted line-breaks for some 
reason see here: http://stackoverflow.com/a/15933860/2057171 ... 
Now for an unrelated-tip: If you want to accept pasted line breaks however 
I suggest you add an "or" to the conditional statement and make it also 
check if "text" isEqualToString @"\r" which is another form of line-break 
not found on the iOS keyboard but it can, however, be found on a website 
and copy-pasted into your textView. If you want to accept pasted text 
with a line-break at the end you will need to change the 
"isEqualToString" code above to say "hasSuffix", this will check for 
any string %@ with a "\n" at the end. (and again for "\r") but make 
sure you don't call your "next" method until after `return YES;` 
has been called and the text view has been updated, otherwise 
you will get only the text that was there before the copy paste 
since this is "shouldChangeTextInRange" method, not 
"didChangeTextInRange", if you do this I suggest stripping the 
"\n" or "\r" from the end of your final string after the copy-paste 
was made and applied and the text was updated. 
*/ 
Các vấn đề liên quan