SpaceDog SpaceDog - 7 days ago 6
iOS Question

Inability to create my UIImageView classes from string

I am creating subclasses of

UIImageView
class, something like
LittleImageView
,
RedImageView
, etc.

These subclasses have this convenience method for the creation of specific images:

+ (UIImageView *)novo {
UIImageView *newImage = [[super alloc] initWithImage:...
// do stuff
return newImage;
}


When I try to create such classes using this new command by string

id newObject = [NSClassFromString(nameOfClass) novo];


I get a crash with "unrecognized selector sent to class". Apparently objective-c is trying to do a
[UIImageView novo]
instead of doing a
[RedImageView novo]
, for instance.

Any ideas how to solve this?

Answer

I can't reproduce your experience exactly, but there are a few changes you should consider: (1) declare the constructor as returning the derived type, (2) declare the local variable as the derived type, (3) used the derived class to alloc (self, not super)...

// in MyImageView.h
+ (instancetype)myImageView:(UIImage *)image;

// in MyImageView.m
+ (instancetype)myImageView:(UIImage *)image {
    MyImageView *miv = [[self alloc] initWithImage:image];
    // ...
    return miv;
}

Now you can use elsewhere without the sketchy use of id in your local variable declaration. It looks like this, and in my test, generates instances of the correct type...

MyImageView *firstTry = [MyImageView myImageView:nil];
MyImageView *secondTry = [NSClassFromString(@"MyImageView") myImageView:nil];

NSLog(@"%@, %@", firstTry, secondTry);
Comments