Нажмите UIViewController с предупреждением без UINavigationController

У меня есть кнопка в 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 находится в другом классе, и я создал его с пользовательской анимацией. Я хочу, чтобы когда пользователь нажимал кнопку (перейти на страницу корзины), страница корзины отображалась так, как если бы она была как (показать, "нажать"). Вот как я программно переместил контроллер представления в класс контроллера предупреждений.

@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)
} 

Контроллер push-представления не работает с контроллером оповещений, я не уверен, что это связано с тем, что я использовал навигацию с оповещением, и если да, то есть ли способ нажать контроллер представления??

Это весь класс 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
  }
 }

person Amal Nasir    schedule 02.05.2018    source источник


Ответы (1)


Проблема в том, что когда вы пытаетесь нажать CartViewController, нет навигационного контроллера, на который можно было бы нажать.

Вы представляете AlertController модально, а затем пытаетесь сделать: navigationController?.pushViewController(CartViewController, animated: true). Если вы поставите здесь точку останова и распечатаете navigationController, я ожидаю, что это ноль.

Я предлагаю вам делегировать AlertController вашему UITableViewController, который находится внутри навигационного контроллера, и заставить контроллер tableview перейти к следующему экрану. Вы также можете представить AlertController внутри навигационного представления, но это кажется излишним.

person Jake G    schedule 02.05.2018
comment
AlertController в другой раскадровке, я не знаю, как представить его модально. Поскольку класс контроллера предупреждений UIViewController, как я могу настроить делегат? - person Amal Nasir; 03.05.2018