Перейдите от пользовательского UIViewController к TabBarController без перехода - PullRequest
0 голосов
/ 02 июля 2018

У меня проблема при переходе от пользовательского UIViewController ко второй вкладке TabBarController, который, конечно, является еще одним UIViewController. Если я перехожу от AdminPanel к продуктам, не происходит сбой, потому что у меня есть push от продуктов к AdminPanel. Но из AdminPanel в корзину у меня нет push.

Вот картинка с ошибкой:

enter image description here

Это ошибка: «Не удалось привести значение типа« MyAppName.AdminPanelViewController »(0x10e878418) к« MyAppName.ProductsViewController »(0x10e877e00)."

Вот мой дизайн:

enter image description here

Вот мой код:

    // PRODUCTS VC
    class ProductsViewController: UIViewController{

var selectedProductsArray = [Product]()
    var priceForSelectedProductsArray = [Float]()

       // Func which is using GestureRecognition to access the Admin Panel when we press on User Avatar
        func accessToAdminPanel(){

            let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ProductsViewController.adminImageTapped(gesture:)))

            userAvatarImageView.addGestureRecognizer(tapGesture)
        }

        // Function to open the AdminPanelViewController
        @objc func adminImageTapped(gesture: UIGestureRecognizer) {

            let storyBoard : UIStoryboard = UIStoryboard(name: Constants.nameOfMainSB, bundle:nil)
            let adminPanelVC = storyBoard.instantiateViewController(withIdentifier: Constants.adminPanelStoryboard) as! AdminPanelViewController
            self.navigationController?.pushViewController(adminPanelVC, animated: true)

        }


        // Func which will add the product into an array of products when the user press Add To Cart
        func didTapAddToCart(_ cell: ProductTableViewCell) {
            let indexPath = self.productsTableView.indexPath(for: cell)

            addProduct(at: indexPath!)
            selectedProductsArray.append(productsArray[(indexPath?.row)!]) // Append products for cart
            priceForSelectedProductsArray.append(productsArray[(indexPath?.row)!].price) // Append prices for selected products
        }

    }


    // CART VC
    class CartViewController: UIViewController {

 var productsInCartArray = [Product]()
    var productPricesArray = [Float]()

     // Append the selectedProducts into productsInCartArray using the TabBarController
        func fetchSelectedProducts() {

    // ------------------HERE IS CRASHING AT THIS LINE -----------------------
            productsInCartArray = ((self.tabBarController?.viewControllers![0] as! UINavigationController).topViewController as! ProductsViewController).selectedProductsArray
            productPricesArray = ((self.tabBarController?.viewControllers![0] as! UINavigationController).topViewController as! ProductsViewController).priceForSelectedProductsArray
            totalSum = productPricesArray.reduce(0, +)
        }

    }

Если вы не можете разобраться с этим разделом кода, где происходит сбой, я могу дать вам ссылку на исходный код git, потому что мне нечего скрывать.

Большое спасибо за ваше время, если вы читаете это, и я надеюсь, что вы можете помочь мне, потому что в течение половины дня я пытаюсь найти решение, чтобы исправить эту ошибку, которая приводила к сбою моего приложения.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Ошибка говорит вам, что вы пытаетесь заставить AdminPanelViewController к ProductsViewControllertopViewController as! ProductsViewController части этой строки.) Это потому, что когда вы нажимаете на AdminPanelViewController, он перемещается в вершина стека навигации, предполагается, что замена ProductsViewController, который, как вы предполагаете, должен быть там.

Существует несколько способов справиться с этой ошибкой в ​​краткосрочной перспективе, таких как итерация по стеку навигации вместо простого захвата topViewController, например:

guard let navController = self.tabBarController?.viewControllers![0] as? UINavigationController else {
    // handle error
    return
}
for controller in navController.viewControllers {
    if let productsController = controller as? ProductsViewController {
        // do work here
    }
}

Но я думаю, что более фундаментально вам придется переосмыслить, как вы получаете доступ к вещам. В общем, вы не должны ходить по стеку навигации, чтобы делать работу. Вам лучше передавать данные между контроллерами во время навигации по стеку.

Кроме того, вам следует избегать принудительного приведения с помощью as! и использовать вместо него as?, что позволит вам обнаруживать случаи, когда приведение не работает без сбоя приложения. Моя личная цель - использовать только ! в декларациях IBOutlet и больше нигде, но ваш пробег может отличаться.

0 голосов
/ 02 июля 2018

topViewController теперь является администратором, а не продуктами, поэтому вам нужно получить VC с индексом 0, то есть продуктами

productsInCartArray = ((self.tabBarController?.viewControllers![0] as! UINavigationController).viewControllers[0] as! ProductsViewController).selectedProductsArray
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...