如何从创建了UIViewController的另一个UIViewController执行函数

时间:2018-07-04 07:26:21

标签: ios swift uitableview uiviewcontroller

我有2个UIViewControllers:ProductsVC和CartVC。在CartVC中,我有一个功能可以从购物车中清除所有产品。 我想做的是当我进入ProductsVC并从CoreData中删除一个产品,然后从第二个VC(即CartVC)中清除所有产品。所以我需要告诉该函数在那里执行。

这是我的代码:

// First VC
class ProductsViewController: UIViewController{

    // Function to delete a Product from the table view and also from CoreData
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

        let productEntity = Constants.productEntity
        let managedContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        let product = productsArray[indexPath.row]
        // -----------   HERE I NEED TO TELL TO "clearAllProducts()" to be executed in the CartVC so when I click on the Cart button, there will be 0 products.
        if editingStyle == .delete {
            managedContext.delete(product)
            do {
                try managedContext.save()
            } catch let error as NSError {
                print(Constants.errorDeletingProduct + "\(error.userInfo)")
            }
        }

        // fetch new data from DB and reload products table view
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: productEntity)
        do {
            productsArray = try managedContext.fetch(fetchRequest) as! [Product]
        } catch let error as NSError {
            print(Constants.errorFetchingData + "\(error.userInfo)")
        }
        productsTableView.reloadData()
    }
}


// Second VC
class CartViewController: UIViewController {


// Clear all products from the cart
    @IBAction func clearAllProducts(_ sender: Any) {

        // Reset Cart tableView
        productsInCartArray = [Product]()
        productPricesArray = [Float]()
        totalSum = 0
        self.tabBarController?.tabBar.items?[1].badgeValue = String(0)

        // Remove selected products from ProductsViewController
        ((self.tabBarController?.viewControllers![0] as! UINavigationController).topViewController as! ProductsViewController).selectedProductsArray = [Product]()
        ((self.tabBarController?.viewControllers![0] as! UINavigationController).topViewController as! ProductsViewController).priceForSelectedProductsArray = [Float]()
        ((self.tabBarController?.viewControllers![0] as! UINavigationController).topViewController as! ProductsViewController).counterItem = 0
        ((self.tabBarController?.viewControllers![0] as! UINavigationController).topViewController as! ProductsViewController).numberOfProductsInCartLabel.text = String(0)
        UIApplication.shared.applicationIconBadgeNumber = 0
        cartTableView.reloadData()
    }
}

这是一张图片,所以请查看我为什么要这样做:

enter image description here

谢谢您的时间!

3 个答案:

答案 0 :(得分:0)

您有两个选择:

1: 如果您的一个视图控制器被另一个视图控制器调用,则可以在被调用的VC中拥有一个委托属性,并将委托的值分配给第一个视图控制器,并且通常只调用委托方法。例如self.delegate?.myFunc()

2: 如果您的视图控制器不直接相关,则可以使用NotificationCenter向所有侦听视图发送通知。 对于您而言,这可能更合适。

答案 1 :(得分:0)

我用一个小函数解决了我的问题,该函数用空值实例化数组。功能是这样的:

// Remove all products from the cart when one ore more products are deleted from the CoreData.
func removeAllProductsFromCart(){

    selectedProductsArray = [Product]()
    priceForSelectedProductsArray = [Float]()
    counterItem = 0
    numberOfProductsInCartLabel.text = String(0)
    self.tabBarController?.tabBar.items?[1].badgeValue = String(0)
    UIApplication.shared.applicationIconBadgeNumber = 0
}

我在这里调用此函数:

if editingStyle == .delete {
    managedContext.delete(product)
    do {
        removeAllProductsFromCart()
        try managedContext.save()
    } catch let error as NSError {
        print(Constants.errorDeletingProduct + "\(error.userInfo)")
    }
}

答案 2 :(得分:0)

我认为共享数据的正确方法是拥有一个自定义的标签栏控制器,并且您的数组应该是标签栏的属性。

这样,两个VC都可以访问数据,并可以使用标签栏控制器的自定义方法根据需要清除数据。