2012-02-21 19 views
0

我是一個有經驗的C++程序員試圖創建的UILabel的我的第一個Objective-C的子類有一個附加的只讀屬性的UILabel子類出現的UILabel在Objective-C

// UINumericlabel.h 
@interface UINumericLabel : UILabel 

// Returns true if the numeric display contains a decimal point 
@property (readonly,nonatomic) BOOL hasDecimalPoint; 
@end 

// UINumericLabel.m 

#import "UINumericLabel.h" 

@implementation UINumericLabel 
// Returns true if the numeric display contains a decimal point 
- (BOOL) hasDecimalPoint; 
{ 
    return [self.text rangeOfString:(@".")].location != NSNotFound; 
} 
@end 

當我嘗試引用hasDecimalPoint屬性的實體化UINumericLabel我得到錯誤中止 2012-02-20 18:25:56.289 Calculator[10380:207] -[UILabel hasDecimalPoint]: unrecognized選擇發送到實例0x684c5c0

在調試它將我的UINumericLabel屬性聲明顯示爲UILabel * 我需要在我的UINumericLabel子類中重寫UILabel的(id)init嗎?我怎麼做?

#import "UINumericLabel.h" 

@interface CalculatorViewController : UIViewController <ADBannerViewDelegate> 
@property (weak, nonatomic) IBOutlet UINumericLabel *display0; 
@end 

當我將鼠標懸停在display0P在調試器它說,這是一個UILabel *不是UINumericLabel *

UINumericLabel * display0P = self.display0;

回答

7

在Interface Builder中選擇標籤,然後打開Identity Inspector。在「Class」文本字段中,可能會顯示UILabel。將其更改爲您的新子類UINumericLabel

+1

僅僅聲明該屬性爲「UINumericLabel」類型是不夠的。您需要告訴Interface Builder使用您的子類。 – ipmcc 2012-02-21 02:48:57

+0

ipmcc - 你是否在我的答案中增加了更多信息或者說它不正確。只是想澄清一下。 – Brian 2012-02-21 03:34:49

+0

@ Brian的回覆看起來對我來說是正確的。 – danh 2012-02-21 04:12:31

0

我同意上面的@Brian,但會增加兩件事:(1)除非您計劃緩存BOOL值,否則不需要聲明屬性。只需使用一個在.h中聲明的方法,並且(2)在這種情況下不需要子類。更好的方法是一個擴展,如:+的UILabel ... JonN.h

@interface UILabel (JonN) 

-(BOOL)hasDecimal; 

@end 

然後,在的UILabel + JonN.m ...

@implementation UILabel (JonN) 

// your method as written 

@end 

這是漂亮,我想,並解決你與IB(我認爲@布萊恩正確解決)的問題。

+0

這只是我添加的將UILabel變成數字顯示的幾個屬性之一。爲了簡潔起見,我簡化了示例。如果我理解上面的示例,則必須使用消息語法[self.display0 hasDecimal]而不是點符號self.display0.hasDecimal調用此示例。這是我的意圖創建一個新的UILabel稱爲UINumericLabel有幾個只讀計算屬性。在不提供實例變量或@synthesize的情況下,我的理解是,BOOL值不會緩存,而是由每次調用時的getter計算得出。那是對的嗎? – JonN 2012-02-21 17:07:42

+0

是的,該屬性會讓你使用點,而方法不會。該物業創建了一個ivar:它只是ivar,getter和setter(以及點符號作爲語法糖)的縮寫,所以我會浪費一點空間讓您的源代碼看起來更甜。特別是因爲你沒有緩存計算,我認爲在這種情況下類別方法的優越性......它不是一種新的UILabel。但是你的子類是可以工作的(只要記得在繪製一個類時在IB中設置類)。 – danh 2012-02-21 19:12:18