我有两个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
的文档,看起来是对的,所以请帮助我。
答案 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)
一些观察结果:
transition
方法仅适用于“视图控制器包含”,其中您有一个父视图控制器,其子视图控制器正在管理父视图控制器视图中的某个子视图。你真的在做视角控制器遏制吗?
如果您没有进行遏制并且只想从一个视图控制器转换到另一个视图控制器,请在navigationController
上使用showViewController
,presentViewController
,pushViewcontroller
,或者从一个过渡到另一个。
话虽如此,即使您打算查看控制器控件,但您的错误消息表明firstVC
和secondVC
为nil
,您对这些变量的分配是似乎不正确。确保
firstVC
和secondVC
都不是nil
; firstVC
是子视图控制器,其视图当前位于父视图控制器的视图层次结构中;和secondVC
之前,已将transition
添加为子视图控制器。请注意,不得省略animations
块。如果您不想进行任何其他动画,请提供空块,而不是nil
。