如何从viewcontroller转换到其他?

时间:2018-01-21 15:27:56

标签: ios objective-c uiviewcontroller nsarray uiviewanimation

我有两个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的文档,看起来是对的,所以请帮助我。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

<强>目标-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

Swift 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
        }
    }
}

答案 1 :(得分:0)

一些观察结果:

  1. transition方法仅适用于“视图控制器包含”,其中您有一个父视图控制器,其子视图控制器正在管理父视图控制器视图中的某个子视图。你真的在做视角控制器遏制吗?

    如果您没有进行遏制并且只想从一个视图控制器转换到另一个视图控制器,请在navigationController上使用showViewControllerpresentViewControllerpushViewcontroller,或者从一个过渡到另一个。

  2. 话虽如此,即使您打算查看控制器控件,但您的错误消息表明firstVCsecondVCnil,您对这些变量的分配是似乎不正确。确保

    • firstVCsecondVC都不是nil;
    • firstVC是子视图控制器,其视图当前位于父视图控制器的视图层次结构中;和
    • 在您致电secondVC之前,已将
    • transition添加为子视图控制器。
  3. 请注意,不得省略animations块。如果您不想进行任何其他动画,请提供空块,而不是nil