如何通过将类名传递给方法来创建子类 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?的主要内容,如果未能解决你的问题,请参考以下文章