2013-04-22 37 views
9

Khi bạn triển khai một danh mục của một lớp trong một tệp, tất cả các thể hiện của lớp đó có thuộc danh mục theo mặc định không?Cách sử dụng các danh mục mục tiêu-C

Tôi mới tham gia Objective-C và tôi đang cố gắng làm cho UITextView không thể chỉnh sửa của mình không thể chọn được. Tôi đã xem qua câu trả lời này sử dụng một loại: https://stackoverflow.com/a/8013538/1533240

Trong đó có các giải pháp sau đây:

@implementation UITextView (DisableCopyPaste) 

-(BOOL) canBecomeFirstResponder 
{ 
    return NO; 
} 
@end 

tôi đã thêm đoạn mã của tôi, nhưng nó dường như không được làm việc trong đó tôi vẫn có thể chọn văn bản. khai của tôi về UITextView là thông thường:

titleLabel = [[UITextView alloc] initWithFrame:frame];

tôi đã cố gắng thay đổi việc kê khai để [DisableCopyPaste alloc] nhưng điều đó dường như không làm việc .. haha.

Cảm ơn!

+0

Vui lòng chỉnh sửa câu hỏi của bạn để mô tả «nhưng dường như không hoạt động.» Cụ thể hơn. –

+0

@JoshCaswell xin lỗi! làm cho nó rõ ràng hơn một chút –

+0

Nó có thể không trả lời câu hỏi của bạn nhưng câu trả lời của tôi ở đây có thể cung cấp cho bạn một sự hiểu biết tốt hơn về 'mục tiêu-c loại' http://stackoverflow.com/questions/12260729/class-files-of-obj -c-giao diện/12262379 # 12262379 – Popeye

Trả lời

20

Bạn hiểu sai về điểm của danh mục. Danh mục thêm các phương thức vào một lớp hiện có. Chúng không bao giờ được sử dụng để ghi đè các phương thức hiện có. Làm như vậy là hành vi không xác định (về mặt kỹ thuật chỉ không xác định trong một trường hợp, nhưng bạn không thể dự đoán được trường hợp đó, vì vậy bạn phải giả sử nó được áp dụng).

Nếu bạn cần ghi đè phương pháp, bạn phải phân lớp, không sử dụng danh mục. Xem câu trả lời hàng đầu cho câu hỏi bạn đã liên kết.

+0

oh okay. cảm ơn! Tôi chỉ đang cố gắng xem liệu tôi có thể thoát khỏi việc không tạo ra một lớp học mới hay không và vì câu trả lời đó ở một số phiếu bầu tốt, tôi muốn thử nó. = P Cảm ơn rất nhiều vì sự thấu hiểu! Tôi có lẽ sẽ đi với một lớp con sau đó. –

0

Những gì bạn cần làm là để khai báo category trong tiêu đề .h file:

như:

@interface UITextView (DisableCopyPaste) 
-(BOOL) methodName 
@end 

sau đó trong .m xác định như

@implementation UITextView (DisableCopyPaste) 
-(BOOL) methodName 
{ 
    return NO; 
} 
@end 

Bạn có thể làm hai điều,

  1. Bạn có thể viết nó vào một lớp và nhập nó vào tất cả các lớp bạn cần chức năng này.
  2. Hoặc viết các dòng này .h.m (tương ứng) bạn cần.
+3

Giao diện là không cần thiết, vì danh mục này là _overriding_ (thực sự, clobbering) là một phương thức hiện có. –

+0

+1 cảm ơn @JoshCaswell – rptwsthi

6

Khi bạn thực hiện một chủng loại một lớp trong một tập tin, sẽ tất cả các trường hợp của lớp đó được, chủng loại theo mặc định?

Có. Nếu bạn tạo một danh mục, the methods in that category are added to the class. Ví dụ: nếu bạn tạo danh mục trên NSString trả về tổng kiểm tra của một chuỗi, bạn có thể sử dụng phương thức đó trên bất kỳ trường hợp nào của NSString.

Tôi đã thêm đoạn mã vào mã của mình, nhưng dường như không hoạt động ở chỗ tôi vẫn có thể chọn văn bản.

Không sử dụng danh mục để ghi đè phương pháp hiện có.

Vì một điều, đó là hình thức xấu. Bạn đang hiệu quả thay đổi hành vi của lớp theo cách mà tác giả không mong đợi. Đối với một điều khác, bạn không thể đếm trên ghi đè để hoạt động - thứ tự các danh mục được thêm vào các lớp không được xác định, vì vậy bạn không bao giờ biết nếu một số loại khác có thể đi kèm và thay thế phương pháp mà bạn đã thử thay thế. Nó chỉ đơn giản là không đáng tin cậy. Nếu bạn cần ghi đè phương thức, hãy tạo một lớp con thay thế.

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