我正在创建UIImageView
类的子类,类似于LittleImageView
,RedImageView
等。
这些子类具有创建特定图像的便捷方法:
+ (UIImageView *)novo {
UIImageView *newImage = [[super alloc] initWithImage:...
// do stuff
return newImage;
}
当我尝试使用字符串
的新命令创建此类时id newObject = [NSClassFromString(nameOfClass) novo];
我遇到了#34;无法识别的选择器发送到班级"。显然,objective-c正在尝试执行[UIImageView novo]
而不是执行[RedImageView novo]
。
任何想法如何解决这个问题?
答案 0 :(得分:1)
我无法准确再现您的体验,但您应该考虑以下几点:(1)将构造函数声明为返回派生类型,(2)将局部变量声明为派生类型,(3) )使用派生类来分配(自我,而非超级)......
// in MyImageView.h
+ (instancetype)myImageView:(UIImage *)image;
// in MyImageView.m
+ (instancetype)myImageView:(UIImage *)image {
MyImageView *miv = [[self alloc] initWithImage:image];
// ...
return miv;
}
现在,您可以在其他地方使用,而无需在本地变量声明中粗略使用id
。看起来像这样,在我的测试中,生成正确类型的实例......
MyImageView *firstTry = [MyImageView myImageView:nil];
MyImageView *secondTry = [NSClassFromString(@"MyImageView") myImageView:nil];
NSLog(@"%@, %@", firstTry, secondTry);