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