2011-10-20 27 views
6

Trong nỗ lực Detect backspace in UITextField, Tôi đã thử phân lớp UITextField and overriding -[UIKeyInput deleteBackward] nhưng chưa bao giờ được gọi. Vì vậy, tôi nghi ngờ UITextField các sự kiện swizzles deleteBackward thành một tên phương thức khác.Thời gian chạy mục tiêu-C: Tên phương thức bị xáo trộn?

Sử dụng Objective-C Runtime, làm cách nào để xác định tên phương thức deleteBackward đã bị chuyển sang? Sau đó, làm cách nào tôi có thể thay đổi triển khai để UITextField sẽ gọi [self.delegate textField:self shouldChangeCharactersInRange:NSMakeRange(0, 0) replacementString:@""] khi nhấn phím xóa khi nó trống.

Ngoài ra, loại siêu lập trình này có thể khiến ứng dụng của tôi bị từ chối khỏi App Store không?

+0

+1, vì đây là câu hỏi khó đoán. – NJones

+0

Bạn đã bao giờ giải quyết vấn đề này chưa? Im có cùng một vấn đề. – MdaG

Trả lời

3

Sự gian lận không thay đổi tên của phương thức. Nếu nó đã làm, nó sẽ không thể gọi phương thức, vì thời gian chạy tìm thấy việc thực hiện bằng cách sử dụng tên. Tất cả những gì nó làm là thay đổi địa chỉ của mã đang chạy khi bạn gọi một phương thức cụ thể.

Tôi đoán là tại sao phương thức deleteBackward không được gọi là hệ thống đầu vào đang sử dụng phương thức từ giao thức UITextInput phức tạp hơn, nhiều khả năng là replaceRange:withText:. Hãy thử điều đó và thực hiện cuộc gọi của bạn khi đối số text là một chuỗi rỗng. Ngoài ra hãy chắc chắn rằng hàm swizzling của bạn không trả về lỗi.

+0

Nhưng ['UITextInput'] (http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITextInput_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UITextInput) phù hợp với [ 'UIKeyInput'] (http://developer.apple.com/library/IOS/documentation/UIKit/Reference/UIKeyInput_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UIKeyInput), yêu cầu' deleteBackward' thành được thực hiện. Vì vậy, không nên yêu cầu 'UITextField' để thực hiện' deleteBackward'? – ma11hew28

+0

Ngoài ra, trong phân lớp của tôi (và trong danh mục của tôi) của 'UITextField', tôi đã thực hiện' replaceRange: withText: 'chỉ với một' NSLog' để xem nó có được gọi hay không. – ma11hew28

+0

@Matt Có, nó yêu cầu 'deleteBackward' được triển khai, nhưng nó không nhất thiết có nghĩa là nó sẽ được sử dụng. Đó chỉ là một khả năng. Tuy nhiên, đọc lại câu hỏi của bạn, tôi nhận thấy rằng bạn chỉ lo lắng khi nó trống rỗng. Liệu một trong hai phương pháp có được gọi là nếu nó không có sản phẩm nào? Có lẽ hệ thống đầu vào không cho biết trường văn bản về nhấn phím nếu nó trống. – ughoavgfhw

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