Как выполнить функцию из другого UIViewController в UIViewController, где был создан - PullRequest
0 голосов
/ 04 июля 2018

У меня есть 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 голосов
/ 04 июля 2018

Я исправил проблему с помощью маленькой функции, которая создает экземпляры моих массивов с пустыми значениями. Вот эта функция:

// 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)")
    }
}
0 голосов
/ 04 июля 2018

Я думаю, что правильный способ обмена данными - иметь собственный контроллер панели вкладок, а ваши массивы должны быть свойством панели вкладок.

Таким образом, оба VC имеют доступ к данным и могут очищать их по мере необходимости, используя собственный метод контроллера панели вкладок.

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

У вас есть два варианта:

1: Если один из ваших контроллеров представления вызывается другим, тогда вы можете иметь свойство делегата в вызванном VC и назначить значение делегата первому контроллеру представления и просто нормально вызывать методы делегата. например self.delegate?.myFunc()

2: Если ваши контроллеры представлений не связаны напрямую, вы можете использовать NotificationCenter для отправки уведомлений всем прослушивающим представлениям. В вашем случае этот, вероятно, больше подходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...