Inability to create my UIImageView classes from st

2019-09-07 06:45发布

问题:

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?

回答1:

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