UILabel подкласс появляется как UILabel в Objective-C - PullRequest
0 голосов
/ 21 февраля 2012

Я опытный программист на C ++, пытающийся создать свой первый подкласс Objective-C UILabel с добавленным свойством только для чтения

// 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 * Нужно ли переопределить (id) init для UILabel в моем подклассе UINumericLabel? Как мне это сделать?

#import "UINumericLabel.h"

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

Когда я нахожу курсор мыши на display0P в отладчике, он говорит, что это UILabel *, а не UINumericLabel *

UINumericLabel * display0P = self.display0;

Ответы [ 2 ]

7 голосов
/ 21 февраля 2012

В Интерфейсном Разработчике выберите метку и затем откройте Identity Inspector.В текстовом поле «Класс», вероятно, написано UILabel.Измените это, чтобы быть вашим новым подклассом, UINumericLabel.

0 голосов
/ 21 февраля 2012

Я согласен с @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 (я думаю, что @Brian корректно решен).

...