Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在第一个模态视图控制器关闭后显示第二个模态视图控制器_Ios_Swift - Fatal编程技术网

Ios 在第一个模态视图控制器关闭后显示第二个模态视图控制器

Ios 在第一个模态视图控制器关闭后显示第二个模态视图控制器,ios,swift,Ios,Swift,我有两个视图控制器,打开模式。当第一个VC关闭时,第二个VC应该打开。但当我关闭第一个窗口时,第二个窗口根本不显示。 有什么问题 我的代码是: self.dismiss(animated: true) { let flowVC = LanguageFlowViewController() self.present(flowVC, animated: true) } 您需要视图控制器的引用,从中可以显示第一个视图控制器 例如,视图控制器名称为X,从那里可以

我有两个视图控制器,打开模式。当第一个VC关闭时,第二个VC应该打开。但当我关闭第一个窗口时,第二个窗口根本不显示。 有什么问题

我的代码是:

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的引用不会为零,但如果您引用以前的视图控制器,它还可能导致内存问题。上述代码的安全性将起作用。请让我知道,如果你仍然得到一些问题。这上面的代码和平将工作。请让我知道,如果你仍然得到一些问题。