【发布时间】:2014-03-27 23:13:15
【问题描述】:
我正在尝试制作一个应用程序,第一步是创建 viewControllers 并链接它们。我知道我可以使用故事板和 sueges 来做到这一点,但我想用老派的方式来做——通过编码,即
它包含 4 个视图控制器
-MainViewController
-SettingsViewController
-RulesViewController
三个视图控制器使用ContainerViewController(4th viewController)(我编写的自定义容器)进行管理。 currentSubViewController 跟踪当前显示的 viewController
@implementation ContainerViewController
{
UIViewController * currentSubViewController;
}
所有三个 viewController 都是从 .nib 创建的
- 主页有“设置”和“规则”两个按钮
- 设置有 2 个按钮“主要”和“规则”
- 规则有 2 个按钮“主要”和“设置”
启动时:
currentSubViewController 被设置为 MainViewController 的一个实例,然后
[container addChildViewController: currentSubViewController]
使容器成为 currentSubViewController 的父级。
主页显示没有任何问题
开机后按“设置按钮”
MainViweController 中的 IBAction 被调用
- (IBAction)onSettings:(id)sender {
if ([self parentViewController]) {
[(ContainerViewController*)[self parentViewController showViewControllerWithName:@"settings"];
}
}
然后调用ContainerViewController中的showViewControllerWithName
- (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
}
SettingsViewController 出现
在SettingsViewController上按下“主”按钮
SettingsMainController 中的IBACtion 被调用
- (IBAction)onMain:(id)sender {
if ([self parentViewController]) { // parentViewController is nil here
[(ContainerViewController*)[self parentViewController] showViewControllerWithName:@"root"];
}
}
但 ParentViewController 在这里是 nil ,因此没有显示任何内容。 SettingsViewController 是上一步中函数调用showViewControllerWithName 中的toVC。
showViewControllerWithName() 和 OnMain() 之间的某个位置,parentViewController 被设置为 nil。我一直检查到 viewDidAppear 并且 parentViewController 直到那时才为零。
我的问题是
-
parentViewController在哪里设置为零? - 要调试这个问题,我想知道在
viewDidAppear之后调用了哪些其他内部函数 - 使用工厂类创建新的 UIViewController 是否会产生问题?
- 是否正在创建实例并且显示的实例不同?尽管我在调试器中检查了内存地址,但它是相同的
我无法解决这个问题。我尝试了一种非常 hacky 的方式,即使在 transitionFromViewController: 抛出异常说两个视图控制器都应该具有相同的父级时,我仍然跟踪派生类中的父级。
我现在被困在这个问题上将近两天了。非常感谢您的帮助。
【问题讨论】:
标签: ios objective-c uicontainerview