Создание экземпляра класса программно в iOS - PullRequest
7 голосов
/ 24 ноября 2011

Я работаю над большим проектом iOS, дизайн не так хорош, как хотелось бы, но я должен придерживаться его.(иногда жизнь может быть сукой).

Дело в том, что у нас есть библиотека, которая в основном позволяет вам просматривать каталог.У вас есть фильтр, в котором вы указываете определенные критерии поиска, и вам предоставляется список, в котором вы можете нажать на интересующие вас элементы.Когда вы нажимаете на элемент, вы можете увидеть его более подробное описание.

Компания, для которой работала компания, продает одно и то же программное обеспечение многим различным компаниям, имеющим разные каталоги.Идея состоит в том, что библиотека обладает всеми основными функциями, и проект, который ее использует, может каким-то образом расширять или полностью перекрывать некоторые из указанных интерфейсов.

Для примера представьте, что в моей библиотеке 2классы, которые управляют 2 представлениями.Это будут «FilterViewController» и «DetailsViewControllers».В каком-то месте кода эти классы создаются.Это выглядело бы примерно так

Class diagram schema

Мой подход примерно такой:

Сторона ProjectA

// Here I configure the library
Library.FilterViewClass = ProjectAFilterViewController;
Library.DetailsViewClass = ProjectADetailViewController;

Сторона ProjectB

Library.FilterViewClass = ProjectBFilterViewController;
Library.DetailsViewClass = nil;

Сторона библиотеки

// Did the user configure the library?
if(self.FilterViewClass == nil){
    // I alloc the default ViewController
    myFilterViewController = [[FilterViewController alloc] init]; 
}else{
    // Here I would like to alloc the custom ViewController
    myFilterViewController = [[Library.FilterViewClass alloc] init]; // DaProblem!
}

Проблема с этим подходом заключается в том, что я на самом деле не знаю, если этоможно создать экземпляр объекта программно.Или, по крайней мере, я не знаю как.Может быть, я использую неправильный подход, некоторые направления будут оценены.Txs заранее!

Ответы [ 3 ]

14 голосов
/ 24 ноября 2011

Чтобы получить класс из строки, вы можете использовать эту функцию

Class cl = NSClassFromString(@"MyClass");

Чтобы получить класс существующей переменной, просто вызовите метод class.

Class cl = [obj class]; // assuming obj1 is MyClass

Теперь вы можете создать экземпляр MyClass

MyClass *myClass = (MyClass*)[[cl alloc] init];
...
[myClass release];
6 голосов
/ 24 ноября 2011

Используйте

myFilterViewController = [[[Library.FilterViewClass class] alloc] init]; 

Вы также можете создать экземпляр из имени класса, если это будет полезно для вас:

id obj = [[NSClassFromString(@"MyClass") alloc] init];
5 голосов
/ 24 ноября 2011
Class someClass = [Foo1 class];
Foo * someObject = [[someClass alloc] init];
[someObject bar];

Class someClass2 = [Foo2 class];
Foo * someObject2 = [[someClass2 alloc] init];
[someObject2 bar];

Интерфейс + Реализация:

@interface Foo : NSObject 
- (void)bar;
@end

@interface Foo1 : Foo

@end

@interface Foo2 : Foo
@end

@implementation Foo
- (void)bar {
    NSLog(@"abstract foo");
}
@end

@implementation Foo1
- (void)bar {
    NSLog(@"foo1bar");
}
@end

@implementation Foo2
- (void)bar {
    NSLog(@"foo2bar");
}
@end

Вывод:

2011-11-24 11:24:31.117 temp[21378:fb03] foo1bar
2011-11-24 11:24:31.118 temp[21378:fb03] foo2bar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...