Ios 在第一个模态视图控制器关闭后显示第二个模态视图控制器
我有两个视图控制器,打开模式。当第一个VC关闭时,第二个VC应该打开。但当我关闭第一个窗口时,第二个窗口根本不显示。 有什么问题 我的代码是:Ios 在第一个模态视图控制器关闭后显示第二个模态视图控制器,ios,swift,Ios,Swift,我有两个视图控制器,打开模式。当第一个VC关闭时,第二个VC应该打开。但当我关闭第一个窗口时,第二个窗口根本不显示。 有什么问题 我的代码是: self.dismiss(animated: true) { let flowVC = LanguageFlowViewController() self.present(flowVC, animated: true) } 您需要视图控制器的引用,从中可以显示第一个视图控制器 例如,视图控制器名称为X,从那里可以
self.dismiss(animated: true) {
let flowVC = LanguageFlowViewController()
self.present(flowVC, animated: true)
}
您需要视图控制器的引用,从中可以显示第一个视图控制器 例如,视图控制器名称为
X
,从那里可以看到第一个视图控制器A
。因此,您需要引用X
来表示B
,因为A
在内存中不可用
因此,当您尝试使用self
显示第二视图控制器时,它将不起任何作用
因此,对于解决方案,将X
视图控制器的引用分配给A
。在类A
中,声明:
var refX: X?
当从X
显示A
时,将self
设置为refX
。比如:
var aVC = A() // This is temp, you need to instantiate your view controller here.
aVC.refX = self
self.present(aVC, animated: true, completion: nil)
现在,内部视图控制器A
,关闭时:
var bVC = B() // This is temp, you need to instantiate your view controller here.
self.dismiss(animated: true) {
if self.refX != nil {
self.refX?.present(bVC, animated: true, completion: nil)
}
}
我希望这将对您有所帮助。您需要查看控制器的参考,从中您可以展示第一个视图控制器 例如,视图控制器名称为
X
,从那里可以看到第一个视图控制器A
。因此,您需要引用X
来表示B
,因为A
在内存中不可用
因此,当您尝试使用self
显示第二视图控制器时,它将不起任何作用
因此,对于解决方案,将X
视图控制器的引用分配给A
。在类A
中,声明:
var refX: X?
当从X
显示A
时,将self
设置为refX
。比如:
var aVC = A() // This is temp, you need to instantiate your view controller here.
aVC.refX = self
self.present(aVC, animated: true, completion: nil)
现在,内部视图控制器A
,关闭时:
var bVC = B() // This is temp, you need to instantiate your view controller here.
self.dismiss(animated: true) {
if self.refX != nil {
self.refX?.present(bVC, animated: true, completion: nil)
}
}
我希望这将对您有所帮助。您正在通过调用
self.dismise()
解除当前视图控制器。
因此,它不可能再显示任何内容,因为它已从视图层次结构中删除。正如其他人提到的,尝试使用self.presentingViewController
或self.navigationController
(如果它位于navigationController上)来显示新视图
但是,如果您需要最大的灵活性,请创建一个委托协议。使用函数presentForChild(viewController:UIViewController)
创建协议。在您之前的视图显示问题中的代码所属的视图之前,请为其提供协议的参考
例如:
protocol ChildPresentDelegate: class {
func presentForChild(vc: UIViewController)
}
class FirstController: UIViewController, ChildPresentDelegate {
func presentForChild(vc: UIViewController) {
present(vc, animated: true, completion: nil)
}
/**
other code
*/
func showControllerAsWasShownInTheQuestion() {
let controller = SecondController()
controller.delegate = self
present(controller, animated: true, completion: nil)
}
}
class SecondController: UIViewController {
weak var delegate: ChildPresentDelegate?
func dismissMySelf() {
self.dismiss(animated: true) {
delegate?.presentForChild(vc: LanguageFlowViewController())
}
}
}
您正在通过调用
self.dismise()
解除当前视图控制器。
因此,它不可能再显示任何内容,因为它已从视图层次结构中删除。正如其他人提到的,尝试使用self.presentingViewController
或self.navigationController
(如果它位于navigationController上)来显示新视图
但是,如果您需要最大的灵活性,请创建一个委托协议。使用函数presentForChild(viewController:UIViewController)
创建协议。在您之前的视图显示问题中的代码所属的视图之前,请为其提供协议的参考
例如:
protocol ChildPresentDelegate: class {
func presentForChild(vc: UIViewController)
}
class FirstController: UIViewController, ChildPresentDelegate {
func presentForChild(vc: UIViewController) {
present(vc, animated: true, completion: nil)
}
/**
other code
*/
func showControllerAsWasShownInTheQuestion() {
let controller = SecondController()
controller.delegate = self
present(controller, animated: true, completion: nil)
}
}
class SecondController: UIViewController {
weak var delegate: ChildPresentDelegate?
func dismissMySelf() {
self.dismiss(animated: true) {
delegate?.presentForChild(vc: LanguageFlowViewController())
}
}
}
尝试
self.presentingViewController.present..
通常,你应该让前一位VC决定做什么,使用展开段、委托或其他方式。最好的做法是将该工作推回到前一位VC尝试self.presentingViewController.present..
通常,你应该让前一位VC决定做什么,使用展开分段、委托或其他方式。最好的做法是将这项工作推回到以前的VCS。我们已经在正在演示的控制器上安装了“presentingViewController”,那么分配引用有什么用呢?@nikksindia,这也是一个好方法,但是,您还需要在显示的视图控制器中参考presentingViewController
。因为当你试着让它完成时,它将是零。所以现在,需要引用并将presentingViewController
存储在其中供以后使用。这样做可能会导致内存泄漏,因为您对X@SagarChauhan在完成时,对presentingViewController的引用不会为零,但如果您引用以前的视图控制器,它还可能导致内存问题。我们在显示的控制器上已经有了“presentingViewController”,那么分配引用有什么用呢?@nikksindia,这也是一个好方法,但您还需要在显示的视图控制器中引用presentingViewController
。因为当你试着让它完成时,它将是零。所以现在,需要引用并将presentingViewController
存储在其中供以后使用。这样做可能会导致内存泄漏,因为您对X@SagarChauhan在完成时,对presentingViewController的引用不会为零,但如果您引用以前的视图控制器,它还可能导致内存问题。上述代码的安全性将起作用。请让我知道,如果你仍然得到一些问题。这上面的代码和平将工作。请让我知道,如果你仍然得到一些问题。