我从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];
}
答案 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...";