Натиснете UIViewController с Alert без 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)
} 

Контролерът за натискане на изглед не работи с контролера за предупреждение, не съм сигурен дали е защото използвах навигацията с предупреждението и ако е така, има ли начин да натисна контролера за изглед??

Това е целият клас 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, който е вътре в контролер за навигация, и да накарате контролера за изглед на таблица да премине към следващия екран. Можете също така да представите AlertController вътре в навигационен изглед, но това изглежда ненужно.

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