NSClassFromString (MyClassName), чем вызывающая функция класса MyClass - PullRequest
0 голосов
/ 10 августа 2011

Я получил класс UIViewCustom с 7 детьми. каждый из детей получил свои собственные функции класса, чтобы помочь инициировать

+(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];

Но, к сожалению, статическая функция не может быть вызвана.

Есть ли способ сказать компилятору, что класс - это не просто класс, но и класс MotherC, чтобы сообщить ему функцию?

Большое спасибо!

EDIT: Предупреждение: семантическая проблема: метод '-minWidth' не найден (тип возвращаемого значения по умолчанию равен 'id')

РЕШЕНИЕ: класс Class вместо класса * class

Ответы [ 3 ]

3 голосов
/ 10 августа 2011

Что-то должно быть не так в другом месте, например, имя класса, который вы проходите.Эта демонстрационная программа работает, как и ожидалось (макет сжат для краткости):

#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
2 голосов
/ 10 августа 2011
  • Objective-C не имеет статических функций.У него есть методы;класс или экземпляр.

  • не ставить методы перед префиксом get;это зарезервировано для конкретного случая использования, это не так.

Ваш код выглядит более или менее правильно.Вы уверены, что childClassName содержит правильное имя класса?

В целом, ваш вопрос указывает на недостаток понимания Objective-C или, по крайней мере, предположение, что Obj-C работает как C ++ (или Java).Я бы предложил прочитать документацию , так как она ответит на различные мета вопросы, которые прояснят все это.

2 голосов
/ 10 августа 2011

Этот ответ кажется связанным: Как мне вызвать + методы класса в Objective C без ссылки на класс?

Вы можете определить интерфейс, который имеет методы, которые вы хотите вызвать, и затеместь что-то вроде:

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

Это должно устранить предупреждения компилятора и сделать ваш код безопасным.

...