2010-11-25 6 views
1

Я создал класс ChImage из UIImageНаследовать от проблемы UIImage

@interface ChImage : UIImage { 
@public 
    int ChannelId; 
    NSString *ChannelName; 
    NSString *Description; 

} 

@property(nonatomic, retain) NSString *ChannelName; 
@property(nonatomic, retain) NSString *Description; 

@end 

@implementation ChImage 


@synthesize ChannelName; 
@synthesize Description; 

@end 

И использовать его в коде:

ChImage *cho = [ChImage imageNamed:img]; 
     cho = [ChImage imageNamed:img]; 
     cho.ChannelName = @"something here..."; 

на разрыв строки приложения cho.ChannelName. Мне нужно расширить UIImage, потому что мне нужно дополнительное свойство в этом классе, но я не знаю, что я делаю неправильно?

Также, когда я пытаюсь получить изображение из UIImageView, я получил ошибку. Я не знаю, есть ли у этого что-то с верхней проблемой:

UIImageView *iw = (UIImageView*) sender; 
    ChImage *im = (ChImage*) iw.image; 

Я просто пытаюсь использовать другую часть кода, и это работает. Проблема должна быть в методе обработки кликов. Это тот метод:

- (void)imageTapped:(UIGestureRecognizer *)sender 
{ 
    UIImageView *iw = (UIImageView*) sender; 
    ChImage *im = (ChImage*) iw.image; 
    NSLog(im.ChannelName); 

} 

Becouse это UIScrollView с изображениями внутри это, как я прикрепил событие щелчка к каждому изображению:

for (imageToAdd in arrayOfImages) 
    {    
     UIImageView *temp = [[UIImageView alloc] initWithImage:imageToAdd];  

     temp.frame = CGRectMake(x, y, 29, 29); 
     temp.userInteractionEnabled = YES;  
     x += 29;   

     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped:)]; 
     [temp addGestureRecognizer:tap];  

     [scrollView addSubview:temp]; 

    } 
+0

Можете ли вы разместить журналы об авариях? – MathieuF 2010-11-25 10:28:49

+0

Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: '- [UITapGestureRecognizer image]: непризнанный селектор, отправленный экземпляру 0x5f39d40' – 1110 2010-11-25 10:36:35

ответ

5

Это не рекомендуется подкласс UIImage , это слой OO поверх CGImageRef и имеет довольно выделенный номер магия участие.

Вы можете создать класс-оболочку, и сделать есть-а отношения вместо есть- отношений. Это похоже на гораздо лучший подход в вашем случае.

  • Не: Канал - это изображение.
  • Вместо этого: канал имеет изображение.

Как это:

@interface Channel : NSObject { 
@private 
    NSString* _name; 
    NSString* _description; 
    UIImage* _image; 
} 
// The rest… 

Вы, вероятно, следует изменить название description, так как он будет конфликтовать с -[NSObject description].

0

Вы отправить +imageNamed:, но вы реализовали этот метод в подкласс? Если нет, сообщение отправляется в UIImage, который вернет экземпляр UIImage, а не ChImage. Поскольку возвращенный UIImage не отвечает на ChannelName, ваше приложение вылетает из строя.

Пример (упрощенный) реализация:

+ (UIImage *) imageNamed: (NSString *) imageName 
{ 
    NSString *filePath = [[NSBundle mainBundle] pathForResource: [imageName stringByDeletingPathExtension] ofType: [imageName pathExtension]]; 
    if (filePath) { 
     ChImage *theImage = [[ChImage alloc] initWithContentsOfFile: filePath]; 
     // configure theImage here if necessary 
     return [theImage autorelease]; 
    } 
    return nil; 
} 

В качестве альтернативы, вы можете рассмотреть вопрос об осуществлении -initWith… инициализатору и использовать его для создания экземпляров подкласса.

0

Не пытайтесь подклассы и добавляйте к этому свойству. Вместо этого создайте свой собственный класс с помощью NSObject и попытайтесь решить вашу проблему. Потому что существует концепция, называемая кластер классов, в которой вам придется переопределить некоторые базовые методы, чтобы заставить ваш класс работать прогестривно.

Checkout код, который я поставил:

@interface ChImage : NSObject { 
    @public 
    UIImage *yourImage; 
     int ChannelId; 
     NSString *ChannelName; 
     NSString *Description; 

    } 

    @property(nonatomic, retain) NSString *ChannelName; 
    @property(nonatomic, retain) NSString *Description; 
    @property(nonatomic, retain) UIImage *yourImage; 

    @end 




@implementation ChImage 

@synthesize ChannelName; 
@synthesize Description; 
@synthesize yourImage; 

@end 

И вместо того, чтобы использовать код:

ChImage *cho = [ChImage imageNamed:img]; 
     cho = [ChImage imageNamed:img]; 
     cho.ChannelName = @"something here..."; 

использовать его как:

ChImage *cho.yourImage = [UIImage imageNamed:img]; 
     cho = [UIImage imageNamed:img]; 
     cho.ChannelName = @"something here..."; 
Смежные вопросы