Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > iOS > Кастомный компонент


Автор: DenisTv 4.9.2011, 13:11
Доброго времени суток!
Во время разработки на objective-c возникла проблема с кастомизацией компоненты.
К примеру: требуется совместить UIImageView и UILabel, для отображения текста на картинке. 
Я решаю созданием своего класса объявление которого выглядит так:
Код

@interface sticker_class : UIImageView{
UILabel *base_label;

}
@property(retain, nonatomic) UILabel *base_label;
-(id)initWithText:(NSString *) theText;
-(CGRect)getRect;
....
@end


а код инициализации так:

Код

-(id) initWithText:(NSString *)theText{
CGRect frameI = CGRectMake(...);
CGRect frameL = CGRectMake(...);
UIImage *img = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"pic_01" ofType:@"png"]];
self = [[UIImageView alloc] initWithFrame:frameI];
[self setImage:img];
base_label = [[UILabel alloc] initWithFrame:frameL];
base_label.text = theText;
base_label.backgroundColor = [UIColor clearColor];
[self addSubview:base_label];
return self;


Однако при добавлении дополнительных методов(пользовательских\своих\getRect) возникает проблема с вызовом. Ругается на неправильную ссылку в памяти. Я подозреваю, что это из-за моего идеологически неправильного подхода к созданию этого класса  smile  

В чем может быть проблема?
Кто как решал подобную задачу?

Автор: DenisTv 4.9.2011, 15:58
А проблема была в неправильном типе родителя) Сложные типы надо наследовать от NSObject и возвращать self при инициализации.

Автор: Bitter 4.9.2011, 22:27
Цитата

 Сложные типы надо наследовать от NSObject

Чушь! Простите. Вы просто неправильно вызываете инициализацию. В ините Вы должны вызвать Init родителя: 

Код

-(id) initWithText:(NSString *)theText{
 CGRect frameI = CGRectMake(...);
 self = [super initWithFrame:frameI]; ///// Это важно !
 if (self) {
  CGRect frameL = CGRectMake(...);
  UIImage *img = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"pic_01" ofType:@"png"]];
  [self setImage:img];
  base_label = [[UILabel alloc] initWithFrame:frameL];
  base_label.text = theText;
  base_label.backgroundColor = [UIColor clearColor];
  [self addSubview:base_label];
 }
 return self;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)