如何通过将类名传递给方法来创建子类UIViewController?

时间:2013-06-27 06:41:47

标签: ios uiviewcontroller

我有4个子类UIViewController,名为AViewController,BViewController,CViewController,DViewController。

现在在工具栏中,单击A,内容视图显示AViewController的视图,等等。

我是一个懒惰的人,讨厌写4次“alloc”initwithnibname“代码,所以我写了下面的代码来代码创建它们。

- (void)addChildView:(UIViewController *)childViewController className:(NSString *)viewClassName{
if (childViewController != nil) {
    // add view
    [self.contentView addSubview:childViewController.view];
}else
{
    // init.
    Class v = NSClassFromString(viewClassName);
    UIViewController *childViewControllerNew = nil;
    childViewControllerNew = [[v alloc] initWithNibName:viewClassName bundle:nil];
    [self.contentView addSubview:childViewController.view];
}}

但是这不会创建任何ViewController,在调试时总是返回nil。

你能告诉我这是什么问题吗?我可以通过这种方法创建子类UIViewController吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

问题是你正在创建一个视图控制器,但是你没有做任何事情。有两个问题:

  1. 错字表示您设置了错误的视图([self.contentView addSubview:childViewController.view];
  2. 您没有保留childViewControllerNew
  3. 您应该将最后一段代码更改为:

    Class v = NSClassFromString(viewClassName);
    UIViewController *childViewControllerNew = nil;
    childViewControllerNew = [[v alloc] initWithNibName:viewClassName bundle:nil];
    [self.contentView addSubview:childViewControllerNew.view];
    
    [self addChildViewController:childViewControllerNew];
    

答案 1 :(得分:1)

如果你真的很懒,你可以声明像

这样的枚举值
typedef NS_ENUM (NSInteger, VC) {
VCa,
VCb,
VCc,
VCd
};

然后在你的

- (void)addChildView:(UIViewController *)childViewController className:(VC)typeOfVC {
switch(typeOfVC)
      case VCa: ViewControllerA *vc = [ViewControllerA alloc] initwithNibName@"YourNibName"]
[self.contentView addSubview:vc.view];
case: VCb : same with B 
etc
etc
}

另外,您可以在其他类中使用这些情况来区分ViewControllers ...