如何从viewcontroller转换到其他?

问题描述 投票:-1回答:2

我有两个viewcontrollers,firstviewcontroller中有一个按钮,当我点击这个按钮时,它会将viewcontroller从第一个切换到第二个

[self transitionFromViewController:firstVC
                  toViewController:secondVC
                          duration:0.3
                           options:UIViewAnimationOptionTransitionNone
                        animations:nil
                        completion:nil];

但它会因错误而崩溃

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'子视图控制器(null)和(null)在调用时必须有一个公共父视图控制器 - [UIViewController transitionFromViewController:toViewController:duration:options:animations:completion:]

我检查了transitionFromViewController:firstVC的文档,看起来是对的,所以请帮助我。

ios objective-c uiviewcontroller nsarray uiviewanimation
2个回答
1
投票

首先,它说您的视图控制器在您的错误日志中都是null。修复它。然后你可以担心过渡..正确阅读你的错误日志..

您需要一个容器控制器,以便您要在其间转换的两个控制器是容器的子级(父控制器)。

例如,要在两个控制器之间进行转换,两者都必须是公共父控制器的子级。然后,您可以调用转换到它们之间的转换。另一种选择是在任何给定时间将ONE作为孩子,通过将其添加为孩子而转移到另一个孩子并移除原件。

下面的控制器交换示例(一次只有一个孩子):

Objective-C的:

@interface ContainerController : UIViewController {
    UIViewController *_currentController;
}
@end

@implementation ContainerController


- (void)switchToViewController:(UIViewController *)controller duration:(NSTimeInterval)duration {

    [controller.view setFrame:self.view.bounds];

    if (_currentController) {
        [_currentController willMoveToParentViewController:nil];
        [self addChildViewController:controller];

        [self transitionFromViewController:_currentController toViewController:controller duration:duration options:UIViewAnimationOptionTransitionCrossDissolve animations:^{

            //Additional animations here..

        } completion:^(BOOL finished) {
            [_currentController removeFromParentViewController];
            [controller didMoveToParentViewController:self];
            [_currentController.view removeFromSuperview];
            _currentController = controller;
        }];
    }
    else {
        [self addChildViewController:controller];
        [self.view addSubview:controller.view];
        [controller didMoveToParentViewController:self];
        _currentController = controller;
    }
}
@end

斯威夫特4:

class ContainerController : UIViewController {
    private var currentController: UIViewController?

    func switchToController(controller: UIViewController, duration: TimeInterval) {
        controller.view.frame = self.view.bounds

        if let currentController = self.currentController {
            currentController.willMove(toParentViewController: nil)
            self.addChildViewController(controller)

            self.transition(from: currentController, to: controller, duration: duration, options: .transitionCrossDissolve, animations: {

                //Additional Animations here..

            }) { (completedTransition) in
                currentController.removeFromParentViewController()
                controller.didMove(toParentViewController: self)
                currentController.view.removeFromSuperview()
                self.currentController = controller
            }
        }
        else {
            self.addChildViewController(controller)
            self.view.addSubview(controller.view)
            controller.didMove(toParentViewController: self)
            self.currentController = controller
        }
    }
}

0
投票

一些观察:

  1. transition方法仅用于“视图控制器包含”,其中您有一个父视图控制器,其子视图控制器正在管理父视图控制器视图中的某个子视图。你真的在做视图控制器遏制吗? 如果您没有进行遏制并且只想从一个视图控制器转换到另一个视图控制器,请在showViewController上使用presentViewControllerpushViewcontrollernavigationController,或者从一个视图转换为另一个视图。
  2. 已经说过,即使你打算查看控制器包含,你的错误信息表明firstVCsecondVCnil,你对这些变量的分配似乎不正确。确保这一点 firstVCsecondVC都不是nil; firstVC是子视图控制器,其视图当前位于父视图控制器的视图层次结构中;和 在你打电话给secondVC之前,transition已被添加为儿童视图控制器。
  3. 请注意,不得省略animations块。如果您不想进行任何其他动画,请提供空块,而不是nil
© www.soinside.com 2019 - 2024. All rights reserved.