2009-12-17 17 views
9

Tôi đang cố gắng thực hiện câu trả lời cho this SO question. Vấn đề là: -[drawTextInRect] rõ ràng là không được gọi, và thiết lập bóng trong -[drawRect] không làm cho văn bản của UITextField bị che khuất.drawTextInRect trên UITextField không được gọi là

Điều kỳ lạ khác là ngay cả khi triển khai phân lớp của tôi là -[drawTextInRect]-[drawRect] hoàn toàn trống (không phải là cuộc gọi đến siêu), văn bản của trường văn bản được vẽ.

Trả lời

12

Đây là lỗi trong tài liệu API UITextField. Tài liệu chỉ ra rằng ghi đè drawTextInRect: có thể được sử dụng để tùy chỉnh hành vi. Đây không phải là trường hợp.

Thực tế, drawTextInRect: sẽ không bao giờ được gọi trên số UITextField (drawPlaceholderInRect: sẽ không được gọi bằng cách này).

Xem thêm http://discussions.apple.com/thread.jspa?threadID=1727596.

Ghi đè phương thức trên UILabel hoạt động.

+0

Correction: 'drawPlaceholderInRect:' vẫn được gọi. Tôi sử dụng nó trong các lớp con của tôi để thay đổi phông chữ và màu văn bản của trình giữ chỗ. – marcshilling

-1

Nếu bạn không gọi siêu, trình biên dịch có thể đang xóa phương thức trong quá trình tối ưu hóa mã của bạn. Có hiệu quả có nghĩa là việc thực hiện UILabel đang được gọi.


Cập nhật: Nếu bạn đang sử dụng một ngòi bút để tạo ra các textfield, hãy chắc chắn bạn đã thiết lập các lớp của textfield trong nib để phân lớp tùy chỉnh của bạn, nếu không mã tùy chỉnh của bạn sẽ không được gọi.

+0

tôi gọi siêu tại một số điểm trong của riêng tôi - [drawRect]. – mrueg

+0

Chỉ cần đọc dòng cuối cùng của bạn và cho bạn biết lý do tại sao nó sẽ không hoạt động cho mục đích thử nghiệm: Một điều kỳ lạ là ngay cả khi triển khai phân lớp của tôi - [drawTextInRect] và - [drawRect] hoàn toàn trống (thậm chí không gọi đến siêu), văn bản của textfield được vẽ. –

+0

nếu bạn không gọi siêu nó giống như ghi đè phương thức và cung cấp triển khai tùy chỉnh - một phương pháp không làm gì trong trường hợp này làm thay đổi hành vi mặc định. Không có lý do nào cho trình biên dịch "tối ưu hóa" một mã bằng cách loại bỏ một phương thức rỗng thực hiện trong các lớp con cho các trường hợp như vậy. Disclaimer: Tôi đã không bỏ phiếu xuống :) –

0

UITextField không phản hồi thông báo - drawTextInRect:. Mã trên trang bạn tham chiếu phân lớp là UILabel không phải là UITextField, đó là lý do tại sao nó không hoạt động cho bạn.

2

Tôi lưu ý rằng - [drawTextInRect] được gọi một lần khi UITextField mất tiêu điểm. Không phải những gì tôi muốn.

4

Tôi đoán phương pháp mà bạn đang tìm kiếm là:

- (CGRect)textRectForBounds:(CGRect)bounds 

hoặc có thể

- (CGRect)editingRectForBounds:(CGRect)bounds