2011-01-12 13 views
8

Tôi có một bàn phím tùy chỉnh mà tôi đang sử dụng để chỉnh sửa văn bản trong mytextField và nó hoạt động tuyệt vời. Tuy nhiên, tôi không bao giờ có thể nhận được các đại biểu shouldChangeCharactersInRange để thực thi bằng cách sử dụng bàn phím tùy chỉnh của tôi. Nó thực hiện khi tôi sử dụng bàn phím thực tế của tôi (rõ ràng không phải là bàn phím iPhone mặc định, vì tôi đã đặt mytextField.inputView = numberPad.view). Tôi nên làm gì để khiến đại biểu shouldChangeCharactersInRange ủy quyền sử dụng bàn phím tùy chỉnh? BTW, bàn phím tùy chỉnh chỉ là một loạt các nút.Làm cách nào tôi có thể nhận được UITextFieldDelegate.shouldChangeCharactersInRange để kích hoạt chế độ nhập liệu tùy chỉnh?

- (void) numberPadPressed: (UIButton *)sender { 
    [mytextField insertText:[[NSNumber numberWithInt:sender.tag] stringValue]]; 
} 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSString *resultingString = [textField.text stringByReplacingCharactersInRange: range withString: string]; 
    NSLog(@"shouldChangeCharactersInRange: %@", resultingString); 
    return true; 
} 

- (void)viewDidLoad { 
    mytextField.text = @""; 
    mytextField.inputView = numberPad.view; 
    mytextField.delegate = self; 
    [mytextField becomeFirstResponder]; 
} 

Trả lời

0

Chỉnh sửa: xin lỗi, đã hiểu nhầm câu hỏi của bạn trước đây.

lĩnh vực văn bản của bạn gọi shouldChangeCharactersInRange khi nó được nhập vào từ bàn phím hệ thống, đem lại cho bạn một cơ hội để xác định xem các văn bản thực sự sẽ hiển thị (ví dụ bạn có thể thực hiện nó để nhận ra một shortcut và chèn một số văn bản dài hơn). Nhưng trường văn bản không nhận ra đầu vào từ chế độ xem tùy chỉnh của bạn dưới dạng nhập văn bản.

Nếu bạn có một inputView tùy chỉnh, bạn không cần phải gọi phương pháp này - chỉ cần cập nhật các trường văn bản trực tiếp từ IBAction của bạn:

- (IBAction) numberPadPressed: (UIButton *)sender { 
    NSString *newText = [[mytextField text] stringByReplacingCharactersInRange:[mytextField selectedRange] withString:string]; 
    [mytextField setText:newText]; 
} 
+0

Tôi vừa thử nghiệm sử dụng đề xuất ở trên, nhưng vẫn nênChangeCharactersInRange không kích hoạt khi numberPadPressed được gọi. Tôi nghĩ rằng chúng tôi đang đi đúng hướng ... – docchang

+0

Tôi sẽ tính toán dải ô như thế nào? Có cách nào để di chuyển con trỏ tại bất kỳ vị trí cụ thể nào trong TextField không? – docchang

+0

Tôi đã cập nhật mẫu mã. Sử dụng [mytextField selectedRange] để có phạm vi được chọn, đây sẽ là điểm chèn nếu không có lựa chọn hoặc sẽ là phạm vi ký tự nếu có lựa chọn. –

10

Bạn sẽ không bao giờ có được shouldChangeCharactersInRange gọi với một bàn phím tùy chỉnh .

Những gì bạn có thể nhận được là sự kiện UIControlEventEditingChanged của số UITextField. Vì vậy, thay vì dựa vào phương pháp shouldChangeCharactersInRange (được biết là lỗi ngoài), bạn nên dựa vào sự kiện này, sẽ được kích hoạt mỗi khi người dùng thay đổi nội dung của trường văn bản.

[textField addTarget:self action:@selector(myTextfieldChangedMethod:) forControlEvents:UIControlEventEditingChanged]; 

Nếu bạn tự sửa đổi trường văn bản bằng bàn phím tùy chỉnh, chỉ cần gọi phương thức này để thông báo cho tất cả người nghe sự kiện UIControlEventEditingChanged.

[textField sendActionsForControlEvents:UIControlEventTouchUpInside]; 
+0

'forControlEvents' của bạn phải khớp với 'sendActionsForControlEvents' của bạn –

0

Tôi biết đây là câu hỏi cũ nhưng tôi gặp phải sự cố tương tự khi cần hỗ trợ các thiết bị trước 5.0. Nếu bạn ghi đè insertText: bằng cách làm theo hướng dẫn từ Rob tại http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html thì bạn sẽ nhận được shouldChangeCharactersInRange để kích hoạt mọi lúc.

Nếu sau đó bạn cần phải hỗ trợ các phím backspace như tôi đã có thể sử dụng các câu trả lời từ @cormacrelf tại How to simulate the delete key on UITextField?

Các snafu duy nhất tôi đã không thể làm việc xung quanh là khi bạn xóa một ký tự từ giữa chuỗi con trỏ nhảy trở lại phần cuối của chuỗi.

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