gpt4 book ai didi

ios - ParentViewController 正在变为 nil ,不知道在哪里以及如何

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:18:30 28 4
gpt4 key购买 nike

我正在尝试制作一个应用程序,第一步是创建 viewControllers 并链接它们。我知道我可以使用 Storyboard和 sueges 来做到这一点,但我想用老派的方式来做——通过编码,即

它包含4个 View Controller

-MainViewController
-SettingsViewController
-RulesViewController

这三个 View Controller 使用 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"];
}
}

然后 ContainerViewControllershowViewControllerWithName 被调用

- (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 的 VC。

showViewControllerWithName()OnMain() 之间,parentViewController 被设置为 nil。我一直检查到 viewDidAppear 并且 parentViewController 直到那时才不为零。

我的问题是

  1. parentViewController 在哪里设置为 nil?
  2. 为了调试这个问题,我想知道在 viewDidAppear
  3. 之后调用了哪些其他内部函数
  4. 使用工厂类创建新的 UIViewController 是否会产生问题?
  5. 正在创建的实例和正在显示的实例是否不同?虽然我在调试器中检查了内存地址,但它是相同的

我无法解决这个问题。我尝试了一种非常 hacky 的方式,我在派生类中跟踪父级,即使 transitionFromViewController: 抛出一个异常,说两个 View Controller 应该有相同的父级。

我现在被困在这将近两天了。我非常感谢您的帮助。

最佳答案

好吧,我终于能够让它工作了。让我再简明扼要地解释一下这个问题

->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为nil

修复如下:

           animations:^{} completion:^(BOOL finished){
[currentSubViewController removeFromParentViewController];
[toVC didMoveToParentViewController:self];

}];

currentSubViewController = toVC;

改为

           animations:^{} completion:^(BOOL finished){

}];
[currentSubViewController removeFromParentViewController];
[toVC didMoveToParentViewController:self];
currentSubViewController = toVC;

现在 SettingsViewController 有一个父级。

好吧,如果有人能解释到底发生了什么,那就太好了。

关于ios - ParentViewController 正在变为 nil ,不知道在哪里以及如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22701161/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com