继承自UIIMage问题

时间:2010-11-25 10:18:59

标签: iphone objective-c inheritance uiimage

我从UIImage创建了类ChImage

@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);

}

这是一张带有图片的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];

    }

3 个答案:

答案 0 :(得分:5)

不建议继承UIImage,它是CGImageRef之上的OO图层,并且涉及很多 magic

您可以创建一个包装类,并执行 has -a 关系,而不是 is-a 关系。在你的情况下,这似乎是一个更好的方法。

  • 不是:频道是图像。
  • 相反:频道有一个图像。

像这样:

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

您应该更改名称description,因为它会与-[NSObject description]冲突。

答案 1 :(得分: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…初始值设定项并使用它来创建子类的实例。

答案 2 :(得分:0)

不要尝试子类并将属性添加到该类。而是使用NSObject创建自己的类并尝试解决您的问题。因为有一个叫做类集群的概念,你必须覆盖一些基本方法才能使你的类更加平稳地工作。

查看我放置的代码:

  @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...";