我有两个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
的文档,看起来是对的,所以请帮助我。
首先,它说您的视图控制器在您的错误日志中都是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
}
}
}
一些观察:
transition
方法仅用于“视图控制器包含”,其中您有一个父视图控制器,其子视图控制器正在管理父视图控制器视图中的某个子视图。你真的在做视图控制器遏制吗?
如果您没有进行遏制并且只想从一个视图控制器转换到另一个视图控制器,请在showViewController
上使用presentViewController
,pushViewcontroller
,navigationController
,或者从一个视图转换为另一个视图。firstVC
和secondVC
是nil
,你对这些变量的分配似乎不正确。确保这一点
firstVC
和secondVC
都不是nil
;
firstVC
是子视图控制器,其视图当前位于父视图控制器的视图层次结构中;和
在你打电话给secondVC
之前,transition
已被添加为儿童视图控制器。animations
块。如果您不想进行任何其他动画,请提供空块,而不是nil
。