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

Posted

技术标签:

【中文标题】如何通过将类名传递给方法来创建子类 UIViewController?【英文标题】:how to create a subclass UIViewController by passing class name to a method? 【发布时间】:2013-06-27 06:41:47 【问题描述】:

我有 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 吗?

提前致谢!

【问题讨论】:

创建后它是 nil,还是你没有保留它,所以它在方法结束时被销毁? 不是零。我会尝试保留它。谢谢。 哦,我的错!我太粗心了。 [self.contentView addSubview:childViewController.view] 应该是 [self.contentView addSubview:childviewControllerNew.view]。抱歉耽误您的时间。 仅此更改仍然不保留控制器,仅保留视图... 是的,这就是问题所在……正在研究如何保留控制器。 【参考方案1】:

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

    拼写错误意味着您设置了错误的视图 ([self.contentView addSubview:childViewController.view];) 你没有保留childViewControllerNew

您应该将最后一段代码更改为:

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

[self addChildViewController:childViewControllerNew];

【讨论】:

我在 addChildView 方法中将 self.viewControllerA 作为参数“childViewController”传递,并在代码中添加 childViewController = childViewControllerNew。但似乎不起作用。该方法似乎无法真正找到参数是定义的属性(非原子,强)。 :( 可能一一编写初始化控制器代码更安全、更快捷。但至少这个问题让我更了解内存管理和 ARC。 终于通过传统方式解决了这个问题。去掉 addChildView 方法,一一编写 viewController 的初始化代码。这次保留了视图控制器。【参考方案2】:

如果你真的很懒,你可以声明枚举值,比如

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...

【讨论】:

以上是关于如何通过将类名传递给方法来创建子类 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章

将 Subview 传递给子类 UIView

如何将双精度向量传递给构造函数,然后在子类中访问其数据(在 C++ 中)?

如何将类名作为变量传递给ruby中的另一个类

c#如何创建类 调用

子类调用父类static方法怎么获得子类类名

如何在运行时将类名传递给 JSON DeserializeObject?