NSClassFromString(MyClassName)比调用MyClass的类函数

时间:2011-08-10 15:42:30

标签: objective-c ios class static-functions

我有一个带有7个孩子的UIViewCustom类。 每个孩子都有自己的班级职能来帮助启动

+(int) minHeight;
+(int) minWidth;

在UITableView中我选择其中一个类,并调用函数“-insertNewObjectWithClassName:(NSString *)childClassName”。

在该函数中,我想根据类名创建实例,所以我尝试了

Class *class = NSClassFromString(childClassName);
CGRect frame = CGRectMake(0, 0, [class minWidth], [class minWidth])
MotherClass *view = [[class alloc] initWithFrame:frame];

但遗憾的是无法调用静态函数。

有没有办法,说编译器那个类不仅仅是一个Class而且还有一个MotherClass来告诉他这个函数?

非常感谢你!

编辑: 警告:语义问题:未找到方法'-minWidth'(返回类型默认为'id')

SOLUTION:Class class而不是Class * class

3 个答案:

答案 0 :(得分:3)

其他地方一定有问题,例如:你要通过的班级的名字。此演示程序按预期工作(为简洁起见,布局紧凑):

#import <Foundation/Foundation.h>

@interface MyChild
+ (int) minHeight;
+ (int) minWidth;
@end

@implementation MyChild
+ (int) minHeight { return 100; }
+ (int) minWidth { return 300; }
@end

int main(int argc, const char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSString *className = [NSString stringWithString: @"MyChild"];
    Class theClass = NSClassFromString(className);
    NSLog(@"%d %d", [theClass minHeight], [theClass minWidth]);

    [pool drain];
    return 0;
}

输出:

2011-08-10 18:15:13.877 ClassMethods[5953:707] 100 300

答案 1 :(得分:2)

这个答案似乎有关:How do I call +class methods in Objective C without referencing the class?

您可以定义一个包含您要调用的方法的接口,然后使用以下内容:

Class<MyCoolView> class = NSClassFromString(childClassName);
CGRect frame = CGRectMake(0, 0, [class getMinWidth], [class getMinWidth]);
MotherClass *view = [[class alloc] initWithFrame:frame];

这应该消除编译器警告并使您的代码类型安全。

答案 2 :(得分:2)

  • Objective-C没有静态功能。它有方法;类或实例。

  • 不要为get添加前缀;这是为特定用例保留的,这不是它。

您的代码看起来或多或少是正确的。您确定childClassName包含类的正确名称吗?

一般来说,你的问题表明对Objective-C缺乏了解,或者至少假设Obj-C的工作方式与C ++(或Java)相似。我建议仔细阅读language documentation,因为它会回答各种元问题,这些问题会使所有这些问题变得非常明确。