我正在开发一个大型iOS项目,设计并不像我希望的那样好,但我必须坚持下去。 (生活有时可能是个婊子)。
问题是我们有一个基本上让你浏览目录的库。您有一个过滤器,您可以在其中指定某个搜索条件,并且您会看到一个列表,您可以按下您感兴趣的项目。当您按某个项目时,您可以看到更详细的描述。
该公司的工作是将同一软件销售给拥有不同目录的许多不同公司。我们的想法是,库具有所有主要功能,并且使用它的项目可能以某种方式扩展或完全覆盖某些给定的接口。
举个例子,假设我的库有2个类来管理2个视图。它们将是“FilterViewController”和“DetailsViewControllers”。在代码的某个地方,这个类被实例化。它看起来像这样
我的方法是这样的:
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!
答案 0 :(得分:14)
要从字符串中获取类,您可以使用此函数
Class cl = NSClassFromString(@"MyClass");
要获取现有变量的类,只需调用class
方法。
Class cl = [obj class]; // assuming obj1 is MyClass
现在您可以创建MyClass
MyClass *myClass = (MyClass*)[[cl alloc] init];
...
[myClass release];
答案 1 :(得分:6)
使用
myFilterViewController = [[[Library.FilterViewClass class] alloc] init];
您也可以从类名实例化,这应该对您有用:
id obj = [[NSClassFromString(@"MyClass") alloc] init];
答案 2 :(得分:5)
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