簡體   English   中英

如何使用Objective-C類別

[英]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

你可以做兩件事,

  1. 您可以在類中編寫它並將其導入到您需要此功能的所有類中。
  2. 或者分別寫下你需要的.h.m這些行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM