从定制UIViewController导航到TabBarController而不进行选择

时间:2018-07-02 17:19:24

标签: ios swift uiviewcontroller uitabbarcontroller

当我从自定义UIViewController导航到TabBarController的第二个选项卡时,我遇到了问题,后者当然是另一个UIViewController。 如果从AdminPanel导航到Products不会崩溃,因为我有一个push从Products到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 :(得分:1)

topViewController现在不是管理员产品,因此您需要在索引为0的VC上获得产品

productsInCartArray = ((self.tabBarController?.viewControllers![0] as! UINavigationController).viewControllers[0] as! ProductsViewController).selectedProductsArray

答案 1 :(得分:0)

该错误告诉您,您正在尝试将AdminPanelViewController强制为ProductsViewController(在该行的topViewController 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声明中使用!,而在其他地方则不能使用,但是您的里程可能会有所不同。