我正在尝试创建一个应用程序,第一步是创建viewControllers并链接它们。我知道我可以使用故事板和sueges做到这一点,但我想用旧式的方式做 - 通过编码即
它包含4个视图控制器
-MainViewController
-SettingsViewController
-RulesViewController
使用ContainerViewController
(第4个viewController)(我写的自定义容器)管理三个视图控制器。 currentSubViewController
跟踪当前显示的viewController
@implementation ContainerViewController
{
UIViewController * currentSubViewController;
}
所有三个viewControllers都是从.nib
创建的启动时:
currentSubViewController设置为MainViewController的实例,然后
[container addChildViewController: currentSubViewController]
使容器成为currentSubViewController的父级。
主页面显示没有任何问题
按下“设置按钮”后启动
MainViweController中的IBAction称为
- (IBAction)onSettings:(id)sender {
if ([self parentViewController]) {
[(ContainerViewController*)[self parentViewController showViewControllerWithName:@"settings"];
}
}
然后showViewControllerWithName
的{{1}}被称为
ContainerViewController
SettingsViewController 显示
开启按- (void) showViewControllerWithName:(NSString*)vctype
{
UIViewController * toVC = [ViewControllerFactory getViewControllerOfType:vctype]; // viewController factory returns the appropriate viewController i.e either MainViewController or SettingsViewController or RulesViewController
toVC.view.frame = containerView.bounds;
toVC.view.autoresizingMask = containerView.autoresizingMask;
[currentSubViewController willMoveToParentViewController:nil];
[self addChildViewController:toVC];
[self transitionFromViewController:currentSubViewController
toViewController:toVC duration:1.0 options:UIViewAnimationOptionCurveLinear animations:^{} completion:^(BOOL finished){
[currentSubViewController removeFromParentViewController];
[toVC didMoveToParentViewController:self];
}];
currentSubViewController = toVC;
// I checked here toVC has a parentViewController set to ContainerViewController
}
在SettingsMainController中调用IBACtion
SettingsViewController
但是ParentViewController在这里是零,因此没有显示任何内容。 SettingsViewController是来自上一步中函数调用 - (IBAction)onMain:(id)sender {
if ([self parentViewController]) { // parentViewController is nil here
[(ContainerViewController*)[self parentViewController] showViewControllerWithName:@"root"];
}
}
的toVC。
介于showViewControllerWithName
和showViewControllerWithName()
之间,OnMain()
设置为parentViewController
。直到那时我检查了viewDidAppear并且parentViewController不是nil。
我的问题是
nil
在哪里设置为nil?parentViewController
我无法解决这个问题。我尝试了一种非常hacky的方式,即在那时我跟踪派生类中的父级,即使然后viewDidAppear
抛出异常,说两个视图控制器应该具有相同的父级。
我现在被困在这两天了。我真的很感激一些帮助。
答案 0 :(得分:1)
好吧,我终于能够让它发挥作用了。让我再简洁地解释一下这个问题
- > ContainerViewController
显示MainViewController
,当您检查MainViewController.ParentController时,它实际上是ContainerViewController
- > ContainerViewController
使用以下函数从MainViewController
转换为SettingsViewController
(void) showViewControllerWithName:(NSString*)vctype
{
UIViewController * toVC = [ViewControllerFactory getViewControllerOfType:vctype];
toVC.view.frame = containerView.bounds;
toVC.view.autoresizingMask = containerView.autoresizingMask;
[currentSubViewController willMoveToParentViewController:nil];
[self addChildViewController:toVC];
[self transitionFromViewController:currentSubViewController
toViewController:toVC duration:1.0 options:UIViewAnimationOptionCurveLinear animations:^{} completion:^(BOOL finished){
[currentSubViewController removeFromParentViewController];
[toVC didMoveToParentViewController:self];
}];
currentSubViewController = toVC;
}
- >转换后SettingsViewController.parentViewController
为零
以下是修复:
animations:^{} completion:^(BOOL finished){
[currentSubViewController removeFromParentViewController];
[toVC didMoveToParentViewController:self];
}];
currentSubViewController = toVC;
更改为
animations:^{} completion:^(BOOL finished){
}];
[currentSubViewController removeFromParentViewController];
[toVC didMoveToParentViewController:self];
currentSubViewController = toVC;
现在SettingsViewController
有父母。
好吧,如果有人能解释到底发生了什么,那就太棒了。
答案 1 :(得分:0)
我只是想在这里打电话。我有一个带有故事板的父/子布局设置,直到有一天工作......
原来我写了一个名为的实用工具方法: - (UIViewController *)addChildViewController:(UIViewController *)chidViewController
事实证明,我的方法名称并不是很有创意,而且我覆盖了一个UIViewController方法。我所要做的就是将其重命名,然后我重新开始营业。这花了很长时间才追查到了!