【问题标题】:Push UIViewController with Alert without UINavigationController在没有 UINavigationController 的情况下使用 Alert 推送 UIViewController
【发布时间】:2018-10-12 20:01:57
【问题描述】:

我在 UITableViewController 中有一个按钮。当我按下这个按钮时,警报控制器会出现询问用户是否要转到购物车页面或留在同一页面,如下所示,

 if user?.uid != nil{
        let title = "Item is added to your cart "
        let alert = AlertController.instance(title: title)
        present(alert, animated: true, completion: nil)
    } else{
       // Alert asks user to register..
    }

AlertController 属于不同的类,我使用自定义动画创建了它。 我希望当用户按下(转到购物车页面)按钮时,购物车页面会显示为(显示,“推送”)segue。 这就是我在警报控制器类中以编程方式推送视图控制器的方式。

@IBAction func showCartButton(_ sender: Any) {
    //---> go to cart page ...
   print("cart button pressed")
    //-----> this code is working fine with other UIviewcontrollers (however it is 'not working in UItableviewcontroller)
    let storyBoard : UIStoryboard = UIStoryboard(name: "Cart", bundle:nil)
    let CartViewController = storyBoard.instantiateViewController(withIdentifier: "CartPage")
    navigationController?.pushViewController(CartViewController, animated: true)
      //-----> this code shows the cart page without the navigation and tabs.. 
  //        let storyBoard : UIStoryboard = UIStoryboard(name: "Cart", bundle:nil)
 //        let CartViewController = storyBoard.instantiateViewController(withIdentifier: "CartPage")
 //        self.present(CartViewController, animated:true, completion:nil)
} 

推送视图控制器不能与警报控制器一起使用,我不确定是不是因为我使用了带有警报的导航,如果是这样,有没有办法可以推送视图控制器??

这是我在单独的故事板中创建的整个 AlertController 类并将其作为初始视图控制器..

 import UIKit

 class AlertController: UIViewController{


@IBOutlet weak fileprivate var AddProductToCartLabel: UILabel!
@IBOutlet weak fileprivate var cartButton: UIButton!
@IBOutlet weak fileprivate var shoppingButton: UIButton!
@IBOutlet weak fileprivate var container: UIView!
var text = String()

override func viewDidLoad() {

    setContainer()
    setCartButton()
    setShoppingButton()


}

override func viewDidLayoutSubviews() {
    layoutContainer()
}

@IBAction func cancel(_ sender: Any) {
    dismiss(animated: true, completion: nil)
}

@IBAction func showCartButton(_ sender: Any) {
    //---> go to cart page ...
   print("cart button pressed")

    let storyBoard : UIStoryboard = UIStoryboard(name: "Cart", bundle:nil)
    let CartViewController = storyBoard.instantiateViewController(withIdentifier: "CartPage")
    navigationController?.pushViewController(CartViewController, animated: true)

     //        let storyBoard : UIStoryboard = UIStoryboard(name: "Cart", bundle:nil)
    //        let CartViewController = storyBoard.instantiateViewController(withIdentifier: "CartPage")
    //        self.present(CartViewController, animated:true, completion:nil)
}

  @IBAction func completeShopButton(_ sender: Any) {
    dismiss(animated: true, completion: nil)
  }
 }

fileprivate extension  AlertController{
// to set the view above
func setContainer() {
    let shape = CAShapeLayer()
    shape.fillColor = UIColor.white.cgColor
    container.backgroundColor = UIColor.clear
    container.layer.insertSublayer(shape, at: 0)
 }
func setCartButton(){
    cartButton.clipsToBounds = true
    //cartButton.layer.cornerRadius = 10
}
func setShoppingButton(){
    shoppingButton.clipsToBounds = true
    shoppingButton.layer.borderColor = UIColor.darkGray.cgColor
    shoppingButton.layer.borderWidth = 1
    //shoppingButton.layer.cornerRadius = 10
  }

 }
  fileprivate extension  AlertController{
  // design the size of the container
  func layoutContainer() {
   let path = UIBezierPath(roundedRect: container.bounds, cornerRadius: 10)
   let layer = container.layer.sublayers?.first as! CAShapeLayer
   layer.path = path.cgPath
 }
}
  extension AlertController{
  static func instance(title: String?) -> AlertController{
      let storyboard = UIStoryboard(name: String(describing: self), bundle: Bundle(for: self))
      let controller = storyboard.instantiateInitialViewController() as! AlertController
      controller.text = title!
      return controller
  }
 }

【问题讨论】:

    标签: swift uiviewcontroller show uialertcontroller unwind-segue


    【解决方案1】:

    问题是当你尝试推送CartViewController时,没有导航控制器可以推送它。

    您以模态方式呈现AlertController,然后尝试执行以下操作: navigationController?.pushViewController(CartViewController, animated: true)。如果你在这里放一个断点并打印出navigationController,我希望它是零。

    我建议您将AlertController 委托回导航控制器内的UITableViewController,并让tableview 控制器推送到下一个屏幕。您也可以在导航视图中显示AlertController,但这似乎没有必要。

    【讨论】:

    • AlertController 在不同的故事板中,我不知道如何以模态方式呈现它。既然是 UIViewController 的 alert controller 类,那我该如何设置delegate呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    相关资源
    最近更新 更多