2011-11-02 39 views
11

Tôi biết điều này đã được yêu cầu trước đó và câu trả lời duy nhất tôi thấy là "Không yêu cầu bàn phím bên ngoài, vì nó đi ngược lại nguyên tắc UI". Tuy nhiên, tôi muốn sử dụng bàn đạp chân như thế này: http://www.bilila.com/page_turner_for_ipad để thay đổi giữa các trang trong ứng dụng của tôi (ngoài việc vuốt). Trình chỉnh sửa trang này mô phỏng bàn phím và sử dụng các phím mũi tên lên/xuống.Làm cách nào để tôi có thể trả lời các phím mũi tên bàn phím bên ngoài?

Vì vậy, đây là câu hỏi của tôi: làm cách nào để tôi phản hồi các sự kiện chính của mũi tên này? Nó phải là có thể như các ứng dụng khác quản lý, nhưng tôi đang vẽ một trống.

Trả lời

21

Đối với những người đang tìm kiếm giải pháp trong iOS 7 - có thuộc tính UIResponder mới được gọi là keyCommands. Tạo một lớp con của UITextView và triển khai các keyCommands như sau ...

@implementation ArrowKeyTextView 

- (id) initWithFrame: (CGRect) frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
    } 
    return self; 
} 

- (NSArray *) keyCommands 
{ 
    UIKeyCommand *upArrow = [UIKeyCommand keyCommandWithInput: UIKeyInputUpArrow modifierFlags: 0 action: @selector(upArrow:)]; 
    UIKeyCommand *downArrow = [UIKeyCommand keyCommandWithInput: UIKeyInputDownArrow modifierFlags: 0 action: @selector(downArrow:)]; 
    UIKeyCommand *leftArrow = [UIKeyCommand keyCommandWithInput: UIKeyInputLeftArrow modifierFlags: 0 action: @selector(leftArrow:)]; 
    UIKeyCommand *rightArrow = [UIKeyCommand keyCommandWithInput: UIKeyInputRightArrow modifierFlags: 0 action: @selector(rightArrow:)]; 
    return [[NSArray alloc] initWithObjects: upArrow, downArrow, leftArrow, rightArrow, nil]; 
} 

- (void) upArrow: (UIKeyCommand *) keyCommand 
{ 

} 

- (void) downArrow: (UIKeyCommand *) keyCommand 
{ 

} 

- (void) leftArrow: (UIKeyCommand *) keyCommand 
{ 

} 

- (void) rightArrow: (UIKeyCommand *) keyCommand 
{ 

} 
+0

Nó có hoạt động với 'UIWebView' không? – Dmitry

+0

@Altaveron thuộc tính keyCommands là thuộc tính trên UIResponder và UIWebView kế thừa từ UIResponder nên tôi không thể thấy lý do tại sao nó không hoạt động. – amergin

+0

'UIWebView' là vùng chứa cho nhiều bản xem trước. – Dmitry

9

Đã sắp xếp! Tôi chỉ cần sử dụng một cái nhìn văn bản 1x1px và sử dụng phương pháp đại biểu textViewDidChangeSelection:

EDIT: Đối với iOS 6 Tôi đã phải thay đổi quan điểm văn bản để 50x50px (hoặc ít nhất là đủ để thực sự hiển thị văn bản) để làm việc này

Tôi cũng đã quản lý để tắt bàn phím ảo khi bàn đạp bị ngắt kết nối.

Đây là mã của tôi trong viewDidLoad:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillAppear:) name:UIKeyboardWillShowNotification object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillDisappear:) name:UIKeyboardWillHideNotification object:nil]; 

UITextView *hiddenTextView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)]; 
[hiddenTextView setHidden:YES]; 
hiddenTextView.text = @"aa"; 
hiddenTextView.delegate = self; 
hiddenTextView.selectedRange = NSMakeRange(1, 0); 
[self.view addSubview:hiddenTextView]; 

[hiddenTextView becomeFirstResponder]; 
if (keyboardShown) 
    [hiddenTextView resignFirstResponder]; 

keyboardShown được khai báo là một bool trong tập tin tiêu đề của tôi.

Sau đó, thêm các phương pháp:

- (void)textViewDidChangeSelection:(UITextView *)textView { 

    /******TEXT FIELD CARET CHANGED******/ 

    if (textView.selectedRange.location == 2) { 

     // End of text - down arrow pressed 
     textView.selectedRange = NSMakeRange(1, 0); 

    } else if (textView.selectedRange.location == 0) { 

     // Beginning of text - up arrow pressed 
     textView.selectedRange = NSMakeRange(1, 0); 

    } 

    // Check if text has changed and replace with original 
    if (![textView.text isEqualToString:@"aa"]) 
     textView.text = @"aa"; 
} 

- (void)keyboardWillAppear:(NSNotification *)aNotification { 
    keyboardShown = YES; 
} 

- (void)keyboardWillDisappear:(NSNotification *)aNotification { 
    keyboardShown = NO; 
} 

Tôi hy vọng mã này giúp ai đó đang tìm kiếm một giải pháp cho vấn đề này. Hãy sử dụng nó.

+1

Đã làm việc tuyệt vời cho tôi, nhưng tôi phải đặt mã khởi tạo trong chế độ xemDidAppear không xemDidLoad. – Bryan

+2

Tôi nghĩ điều này dẫn đến một vòng lặp vô hạn, bởi vì thiết lập thuộc tính 'selectedRange' (trong' textViewDidChangeSelection') kích hoạt 'textViewDidChangeSelection' khác, mặc dù ý tưởng này thực sự đã giúp tôi. –

+0

Nó sẽ không gây ra vòng lặp vô hạn, vì 'selectedRange' chỉ được đặt nếu vị trí con trỏ là 0 hoặc 2. – colincameron

Các vấn đề liên quan