如何在呈现时避免多个视图控制器实例

时间:2017-02-28 14:43:22

标签: ios swift3

我有一个名为JobdetailsViewcontroller的视图控制器。我只想为该控制器创建实例。我的意思是如果已经呈现视图控制器想要再次关闭先前和现在的新控制器。 这是我的用例。我有方法“ShowJobdetails”,它将在我的应用程序中调用这么多地方。

func ShowJobdetails(_ attributes: NSDictionary)
{
   /// Cheking if it's already presented 
    if let jobdetais = self.Jobdetails
    {
        jobdetais.dismiss(animated: true, completion: {

            self.PresentJobdetails(attributes)

        })
    }
    else{
        self.PresentJobdetails(attributes)
    }

}

 func PresentJobdetails(_ attributes: NSDictionary)
 {
    /// initialing view controller and presenting it.
    AppManager.topViewController()?.present(Jobdetails, animated: true, completion: {

        self.Jobdetails = Jobdetails /// here I'm saving instance of view controller. 

  })

但是,如果同时调用“ShowJobdetails”2次,我的视图控制器将呈现2次一次。

如何避免这种情况?

谢谢

4 个答案:

答案 0 :(得分:1)

您可以在本地存储您的jobdetailsviewcontroller,并执行以下操作:

lazy var jobDetailsViewController: JobDetailsViewController = {
    return self.storyboard?.instantiateViewController(withIdentifier: "JobDetailsViewController") as! JobDetailsViewController
}()

@IBAction func presentJobDetails() {
    if let presentedViewController = presentedViewController, presentedViewController == jobDetailsViewController {
        // already presented
        dismiss(animated: true, completion: {
            self.presentJobDetails()
        })
        return
    }

    // prepare your jobdetailsviewcontroller here
    present(jobDetailsViewController, animated: true, completion: nil)
}

答案 1 :(得分:0)

我突出的一个问题是你在jobDetails上调用.dismiss(),它是呈现的视图控制器。但是,需要在呈现视图控制器上调用dismiss()。

答案 2 :(得分:0)

我徘徊在你self.Jobdetails的哪个位置,它始终存在Jobdetails

所以let if jobdetais = self.Jobdetails中的法官可能永远不会工作

答案 3 :(得分:0)

我会检查最后一个呈现的视图控制器是否是JobDetailsViewController并在这种情况下解除它:

func showJobDetails(_ attributes: NSDictionary) {
    let presenter = AppManager.topViewController()

    let jobDetailsViewController = storyboard?.instantiateViewController(withIdentifier: "JobDetailsViewController") as! JobDetailsViewController

    // Configure jobDetailsViewController here, e.g.
    //jobDetailsViewController.attributes = attributes

    if presenter?.presentedViewController?.isKind(of: JobDetailsViewController.self) == .some(true) {
        presenter?.dismiss(animated: true) {
            presenter?.present(jobDetailsViewController, animated: true, completion: nil)
        }
    } else {
        presenter?.present(jobDetailsViewController, animated: true, completion: nil)
    }
}

我测试了它并且它有效。在我的情况下,我使用view.window?.rootViewController作为演示者。

编辑:如何避免多个视图控制器实例的另一种方法是不要关闭视图控制器,只需更改它的内容即可。但我不知道你的用例是否可以。

另请注意,在Swift中,我们使用小写的起始字母编写变量和函数名称。如果您编写纯Swift应用程序,我会使用Dictionary而不是NSDictionary ...例如[String: String][String: Any]