2012-02-21 11 views
0

私は経験豊富な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 

でUILabelの私の最初のObjective-Cのサブクラスを作成しようとしています私はインスタンス化UINumericLabelためhasDecimalPointプロパティを参照しようとすると、私はエラーでアボートを取得 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でラベルを選択し、アイデンティティ・インスペクタを開きます。テキストフィールド "Class"にはおそらくUILabelと書かれています。これを新しいサブクラスであるUINumericLabelに変更します。

+1

プロパティが 'UINumericLabel'型であると宣言するだけでは不十分です。サブクラスを使用するには、Interface Builderに指示する必要があります。 – ipmcc

+0

ipmcc - 私の答えに情報を追加しているのか、それとも正しくないのですか?ちょっとした説明をしようとしています。 – Brian

+0

@ Brianの回答は私にとって正しいと思われます。 – danh

0

私は上記の@Brianに同意しますが、2つのことを追加します。(1)BOOL値をキャッシュする予定がない限り、宣言されたプロパティは必要ありません。 .hで事前宣言されたメソッドを使用するだけで、(2)この場合はサブクラスを必要としません。より良いアプローチは次のように、延長のようになります。

@implementation UILabel (JonN) 

// your method as written 

@end 

これはきれいです... UILabel + JonN.mで、... UILabel + JonN.hその後

@interface UILabel (JonN) 

-(BOOL)hasDecimal; 

@end 

、私が思うに、あなたがIBで抱えていた問題を解決します(これは@Brianが正しく対処したと思います)。

+0

これは、UILabelを数値表示にするために追加したいくつかのプロパティのうちの1つに過ぎません。投稿の簡潔さのために私の例を単純化しました。上記の例を理解していれば、ドット表記self.display0.hasDecimalの代わりに[self.display0 hasDecimal]というメッセージ構文で呼び出す必要があります。 UINumericLabelと呼ばれる新しい種類のUILabelを作成することが私の意図でしたが、これにはいくつかの読み込み専用に計算されたプロパティがありました。インスタンス変数や@synthesizeを指定しなければ、BOOLの値はキャッシュされず、各呼び出しでgetterによって計算されるということは私の理解です。あれは正しいですか? – JonN

+0

はい、このプロパティではドットを使用できますが、メソッドでは使用できません。このプロパティは、ivarを作成します。これは、ivar、getter、setter(および構文的な砂糖としてのドット表記)の略語なので、ソースコードを少し甘く見せるために少しスペースを浪費します。特に計算をキャッシュしていないので、カテゴリメソッドのアプローチが優れていると思います。本当に新しいタイプのUILabelではありません。しかし、あなたのサブクラスは機能します(あなたがペイントするたびにIBでクラスを設定することを忘れないでください)。 – danh

関連する問題