[英]How to Use Objective-C Categories
在文件中實現類的類別時,默認情況下該類的所有實例都屬於該類別嗎?
我是Objective-C的新手,我試圖使我的不可編輯的UITextView不可選。 我使用以下類別找到了這個答案: https : //stackoverflow.com/a/8013538/1533240
其中有以下解決方案:
@implementation UITextView (DisableCopyPaste)
-(BOOL) canBecomeFirstResponder
{
return NO;
}
@end
我將代碼段添加到我的代碼中,但它似乎沒有起作用,我仍然可以選擇文本。 我對UITextView
聲明是通常的:
titleLabel = [[UITextView alloc] initWithFrame:frame];
我嘗試將聲明更改為[DisableCopyPaste alloc]
但這似乎不起作用..哈哈。
謝謝!
你誤解了類別的重點。 類別將方法添加到現有類。 它們絕不能用於覆蓋現有方法。 這樣做是未定義的行為(技術上只在一種情況下未定義,但您無法預測這種情況,因此您必須假設它適用)。
如果需要覆蓋方法,則必須是子類,而不是使用類別。 查看您鏈接的問題的最佳答案。
在文件中實現類的類別時,默認情況下該類的所有實例都屬於該類別嗎?
是。 如果創建類別, 則該類別中的方法將添加到類中 。 例如,如果在NSString上創建一個返回字符串校驗和的類別,則可以在NSString的任何實例上使用該方法。
我將代碼段添加到我的代碼中,但它似乎沒有起作用,我仍然可以選擇文本。
不要使用類別來覆蓋現有方法。
首先,它是糟糕的形式。 您正在以作者沒想到的方式有效地改變類的行為。 另一方面,你不能指望覆蓋工作 - 沒有定義類別添加到類的順序,所以你永遠不知道是否可能出現其他類別並替換你試圖替換的方法。 它根本不可靠。 如果需要覆蓋方法,請改為創建子類。
你需要做的是在header .h
文件中聲明category
:
如:
@interface UITextView (DisableCopyPaste)
-(BOOL) methodName
@end
然后在.m
定義為
@implementation UITextView (DisableCopyPaste)
-(BOOL) methodName
{
return NO;
}
@end
你可以做兩件事,
.h
和.m
這些行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.