pushVIewController导致dismiss不起作用,present删除导航栏

时间:2017-08-07 20:40:33

标签: swift

在我的应用程序中,我从初始视图控制器转到查看控制器2.在一些地方,在主要方式上我这样做

      if let addVC = self.storyboard?.instantiateViewController(withIdentifier: ADD_CARD_STORYBOARD_IDENTIFIER) as? AddCardViewController {
        let addNavigation = UINavigationController(rootViewController: addVC)
        if UIDevice.current.userInterfaceIdiom == .pad {
          self.splitViewController?.present(addNavigation, animated: true, completion: nil)
        }
        else {
          self.present(addNavigation, animated: true, completion: nil)
        }
      }

我遇到过在iPad上工作的一些问题以及在iPhone上工作的事情,而不是相反。

在View Controller 2上,当我完成了我需要做的事情时,我使用

self.dismiss(animated: true, completion: nil)

这很有效。

但是,用户也可以点击一个按钮VC 1,它会调出一个UIAlertController

从UIAlertController我可以去第二个VC。然而就此而言,我没有在场(...我在做什么

if let addCardVC = self.storyboard?.instantiateViewController(withIdentifier: ADD_CARD_STORYBOARD_IDENTIFIER) as? AddCardViewController {
  self.navigationController?.pushViewController(addCardVC, animated: true)
}

这就是我的问题所在。如果我做了推,然后尝试在第二个VC上解雇没有任何反应。

我试图在这里做礼物,但是当我做第二个VC时丢失了导航栏。

无论如何,我可以做现在并保留导航栏,还是我需要做其他事情?

2 个答案:

答案 0 :(得分:0)

如果我理解的话,我现在不是真的,但似乎有两种方法可以通过VC1或UIAlertController转到VC2。

我建议你创建一个协议并在你的VC1中实现它,这样你就可以将它传递给你的UIAlertController(如果你有一个自定义的UIAlertController)。在解雇你的UIAlertController之后,你将调用由VC1实现的委托方法,然后它将负责推送视图控制器。例如:

协议

protocol VCDelegate {
    pushToVC2()
}

VC1类:

class VC1: UIViewController, VCDelegate {

    //...       

    let customAlertVC = CustomAlertViewController() // Declaring your custom alert view controller

    override func viewDidLoad(){
        super.viewDidLoad()

        customAlertVC.delegate = self // Set its delegate
    } 

    func pushToVC2(){ // implementing method to go to VC2
        self.storyboard?.instantiateViewController(withIdentifier: ADD_CARD_STORYBOARD_IDENTIFIER) as? AddCardViewController {
            self.navigationController?.pushViewController(addCardVC, animated: true)
        }
    }

}

自定义UIAlertViewController:

class CustomAlertViewController: AlertViewController {

     // delegate to call the implemented method in VC1
     var delegate: VCDelegate?

     //...

     func didTapButton(){
         self.dismiss(animated: false) {
             delegate.pushToVC2() // called on dismiss completion
         }
     }

} 

答案 1 :(得分:0)

我发现了我的错误。我没有使用

 let addNavigation = UINavigationController(rootViewController: addVC)

我只想说

if let addCardVC = self.storyboard?.instantiateViewController(withIdentifier: ADD_CARD_STORYBOARD_IDENTIFIER) as? AddCardViewController {
  self.navigationController?.present(addCardVC, animated: true, completion: nil)
}

当我需要说

if let addCardVC = self.storyboard?.instantiateViewController(withIdentifier: ADD_CARD_STORYBOARD_IDENTIFIER) as? AddCardViewController {
let addNavigation = UINavigationController(rootViewController: addCardVC)
self.navigationController?.present(addNavigation, animated: true, completion: nil)
}