2013-04-22 30 views
9

當您在文件中實現類的類別時,默認情況下該類的所有實例都是該類別的嗎?如何使用Objective-C類別

我是新來的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]但似乎並沒有工作..哈哈。

謝謝!

+0

請編輯您的問題來描述«但它似乎並沒有工作。»更具體地說。 – 2013-04-22 18:37:56

+0

@JoshCaswell對不起!使它更清晰 – 2013-04-22 18:38:50

+0

它可能不會回答你的問題,但我在這裏的回答可能會讓你更好地理解'objective-c categories' http://stackoverflow.com/questions/12260729/class-files-of-obj -c-interface/12262379#12262379 – Popeye 2013-04-22 18:42:39

回答

20

您誤解了類別的要點。類別將方法添加到現有的類。它們絕不能用於覆蓋現有的方法。這樣做是未定義的行爲(技術上在一個案例中只有未定義,但不能預測該案例,因此您必須假定它適用)。

如果您需要重寫方法,則必須進行子類化,而不是使用類別。查看關聯問題的最佳答案。

+0

哦好吧。謝謝!我只是想看看我是否可以不參加新班級,並且因爲這個答案的票數很多,所以我想嘗試一下。 = P非常感謝您的見解!那麼我可能會去使用一個子類。 – 2013-04-22 18:44:57

0

你需要做的是要申報category在頭.h文件:

如:

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

然後在.m定義爲

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

你可以做兩兩件事,

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

該接口不是必需的,因爲此類別是_overriding_(實際上是clobbering)現有方法。 – 2013-04-22 18:48:39

+0

+1謝謝@JoshCaswell – rptwsthi 2013-04-22 18:49:47

6

當您在一個文件實行一類一類,將所有的類的實例 按默認的類別?

是的。如果您創建一個類別,the methods in that category are added to the class。例如,如果您在NSString上創建一個返回字符串校驗和的類別,那麼您可以在NSString的任何實例上使用該方法。

我將代碼片段添加到我的代碼中,但它似乎沒有工作,我仍然可以選擇文本。

請勿使用類別來覆蓋現有的方法。

首先,它是不好的形式。你有效地改變類的行爲,作者沒有想到的方式。另一件事,你不能指望覆蓋的工作 - 類別添加到類的順序沒有定義,所以你永遠不知道是否有一些類別可能會出現,並替換你嘗試的方法取代。這根本不可靠。 如果您需要重寫方法,請改爲創建一個子類。

相關問題