2009-07-14 30 views
6

Tôi đang gặp sự cố khi cố thay đổi hành vi cắt/sao chép/dán của UITextView. Điều tôi muốn đạt được là: phát hiện khi người dùng đã dán một số văn bản vào UITextView. Khi tôi phát hiện ra điều này, tôi sẽ kiểm tra dữ liệu và làm việc của tôi.Phát hiện khi người dùng nhấp vào nút dán trong UITextView

Theo tài liệu, tôi đã tìm hiểu về UIResponder.

Vì vậy, tôi đã tạo một lớp đơn giản kế thừa UITextView. trong tệp .m Tôi tạo 1 hàm được gọi.

-(void) paste:(id)sender{ 
    NSLog(@"paste button was pressed do something"); 
} 

Nhưng vì lý do nào đó, điều này dường như không bao giờ xảy ra. Tôi có thể nhận được câu lệnh chọn làm việc và truy tìm dữ liệu.

-(void) select:(id)sender 

1. Đây có phải là cách chính xác để phát hiện Dán trong UITextView không? 2. Ngay bây giờ tôi đang theo dõi mua bao nhiêu nhân vật UITextView thay đổi và nếu nó lớn hơn một char thì tôi nghi ngờ rằng nó có thể là một hoạt động dán. Nhưng kể từ khi iPhone có thể tự động hoàn thành từ ví dụ như Wedn (đi đến thứ tư) nó có thể không phải là một hoạt động dán. Trong Interface Builder, tôi đã chọn textView của mình trong tệp NIB và đã chọn "Class Identity" cho lớp gần như đã tạo của mình trước đó và tôi biết rằng tệp này đang hoạt động như một lớp con nhưng nó sẽ không phản hồi biến cố.

cảm ơn.

Trả lời

2

Trong trường hợp ai đó vẫn cần giải pháp ngắn và dễ dàng, tôi sẽ chia sẻ của tôi. Tôi sử dụng danh mục tuyệt vời của NSObject + REResponder từ REKit project. Giải pháp là dễ dàng như thế này:

- (void)hookMessageTextFieldPasteAction 
{ 
    void (^textFieldDidPasteBlock)(id receiver, id sender) = ^(id receiver, id sender) 
    { 
     NSLog(@"paste hook"); 
    }; 
    [self.messageTextField respondsToSelector:@selector(paste:) withKey:nil usingBlock:textFieldDidPasteBlock]; 
} 
1

Có mã trên của bạn để dán là chính xác theo Tài liệu của Apple đề cập đến nó here.

- (void)paste:(id)sender 

Tôi nghi ngờ bạn đang triển khai tệp sai. Bạn nên triển khai nó trong một tập tin thuộc chuỗi 1 của Responder. Bạn đã phân lớp UITextView hay bạn đang sử dụng một vani trong ViewController của bạn?

Hmmm Tôi nghĩ rằng vấn đề là bạn có thể cần phải làm cho lớp con UITextView của bạn trở thành đại biểu để cho phương thức đại biểu hoạt động, bởi vì nó không phải là ngoại hình của mọi thứ. Tôi sẽ cố gắng tìm cách tôi đã làm điều đó trước đây.

Được rồi tôi nghĩ rằng tôi đã tìm thấy nó. Tôi nghĩ bạn cần thực hiện việc này trên lớp UITextField của lớp con của bạn:

@interface mySpecialTextFieldClass : NSObject <UITextFieldDelegate> 
{ 

} 

Việc thêm vào cuối sẽ hoạt động! Những gì nó làm là làm cho phân lớp của bạn trở thành một đối tượng của một loại mà đại biểu có thể gửi thông báo đến ... đó là đa hình, trừ khi ai đó muốn sửa tôi ở đây :)

Một điều cuối cùng để thử John, trong ViewController chứa IBOutlet đến UITextView, thử gọi phương pháp này về trường hợp của các UITextView:

[myUITextView setDelegate:self]; 

Chỉ cần ném một cái gì đó hoàn toàn ngẫu nhiên trong đó thử thiết lập nó để trở thành responder đầu tiên.

[myUITextView becomeFirstResponder]; 

Điều này được gọi là lập trình trong kiddies tối! Và là một cách rất xấu để lập trình, nhưng tôi thừa nhận tôi làm điều đó và đôi khi nó trả hết: P lol.

+0

Xin chào, tôi đã phân lớp UITextView và tôi biết rằng phân lớp đang làm việc mua thực hiện một số phương pháp khác. Tôi cũng có mã dán trong lớp con của mình. Nhưng điều này dường như không hoạt động (tốt trong mô phỏng). –

+0

Tôi đã cập nhật câu trả lời của mình, nhưng Trình mô phỏng sẽ không tạo ra bất kỳ sự khác biệt nào để bạn biết. Và đã cho bạn +1 btw: P –

+0

Xin chào một lần nữa, tôi đã sử dụng điều này khi bạn đề xuất có UITextFeildDelegate. @ interface BSTextView: UITextView --- đây là một cái gì đó khá ngẫu nhiên --- nếu tôi thực hiện "chọn" phương pháp, điều này làm việc cho một "chọn" - (void) chọn: (id) người gửi { \t NSLog (@ "Tôi muốn chọn"); } nhưng vẫn không có tình yêu từ thiết bị hoặc trình giả lập nếu tôi nhấn dán. Tôi nghĩ rằng đây thực sự là một BUG ... –

3

UITextView có chế độ xem xử lý việc cắt, sao chép, dán. Đó là UIWebDocumentView. Vì vậy, nếu UITextView là người trả lời đầu tiên, UIWebDocumentView sẽ nhận được nó đầu tiên thay vì thực hiện của bạn. Tôi muốn ghi đè lên các chức năng này vì vậy điều này rất bực bội.

+0

Hi Lillian, bạn đã từng làm việc này chưa? –

+0

Xin lỗi. không may mắn ... Hy vọng Apple sẽ mở nó cho chúng tôi. –

3

Điều tương tự cũng xảy ra với tôi. Chọn (và sao chép đôi khi) được gọi nhưng không bao giờ dán.

Tôi đã mô phỏng hành vi bằng cách sử dụng textViewDidChange nơi tôi luôn xác minh sự khác biệt giữa văn bản hiện tại và văn bản trước đó. Nếu có nhiều chữ cái khác nhau và text.length lớn hơn chữ cái phải được dán.

Hy vọng Apple sẽ sửa lỗi này.

+0

Đây chính xác là những gì tôi làm. Nhưng được cảnh báo những thứ như thứ tư sẽ tự động hoàn thành và cung cấp cho bạn đọc sai. vì vậy hãy cẩn thận và khiến bạn textview.length tăng hơn 1. –

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