我有一个带有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
答案 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,因为它会回答各种元问题,这些问题会使所有这些问题变得非常明确。