Перезагрузка UITableView с кнопки в другом классе (Swift)

#ios #swift #uitableview

#iOS #быстрый #uitableview #swift

Вопрос:

У меня есть приложение, в котором я пытаюсь реализовать функцию добавления в корзину в приложении с несколькими вкладками. У меня есть одна вкладка для страницы моего магазина и одна вкладка для страницы моей корзины, и я настроил свою страницу магазина как табличное представление, где каждая ячейка ведет к контроллеру представления с информацией о продукте, внутри которого вы можете нажать кнопку «Добавить в корзину», которая добавляет товар в массивэто позже отображается в табличном представлении моей страницы корзины.

Проблема, с которой я сталкиваюсь, заключается в том, что, как только я перехожу на страницу корзины и пытаюсь добавить товары в корзину, массив изменяется (проверено с помощью печати), но TableView не перезагружается, и я не вижу добавляемых товаров. Если я просто перехожу на страницу магазина, затем добавляю товары, а затем открываю корзину, все товары загружаются, но я больше не могу добавлять.

Как мне сделать так, чтобы, когда я нажимаю кнопку «Добавить в корзину» (в другом классе и другом представлении), он обновлял TableView (в другом классе) и обновлял, даже после того, как мой TableView уже был изначально загружен?

Вот мой код для кнопки (в прокомментированном месте указано, где я хочу, чтобы какая-то функция перезагружала таблицу):

 @IBAction func addToCartPressed(_ sender: Any) {
    //Code that adds the item to the array called cartArray that is in the other class
    // I want to call a "table reload" here so that it reloads the tableView on the cart page

    viewDidLoad()
    }
  

А вот мой ViewController для страницы корзины:

 import UIKit
var cartArray =  [Cart(name: "initial", thumbnails: "sgA1.jpg", price: "initial", quantity: 0)]
class CartViewController: UIViewController{

@IBOutlet var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.dataSource = self
    tableView.reloadData()

    // Do any additional setup after loading the view.
}}

extension CartViewController: UITableViewDataSource{
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if(cartArray[0].name.isEqual("initial")){
            return 0
        }
        else{
        return cartArray.count
        }
    }

     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as? CartViewCell {
            cell.configurateTheCell(cartArray[indexPath.row])
            return cell
        }
        tableView.reloadData()
        return UITableViewCell()
        
    }
}
  

Я хочу иметь возможность каким-то образом перезагрузить TableView здесь после того, как я обновил массив нажатием кнопки в другом классе. Как мне это сделать?

Комментарии:

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

Ответ №1:

Вы можете перезагружать табличное представление при каждом cartArray обновлении.

Просто выполните следующие действия

 var cartArray =  [Cart(name: "initial", thumbnails: "sgA1.jpg", price: "initial", quantity: 0)] {
    didSet { 
       NotificationCenter
           .default
           .post(Notification(name: "cartArrayUpdated"))
    }
}
  

Затем добавьте свой CartViewController статус наблюдателя для этого уведомления

 override func viewDidLoad() {
    super.viewDidLoad()
    tableView.dataSource = self
    tableView.reloadData()
    NotificationCenter
       .default
       .addObserver(self, 
                    selector: #selector(refresh), 
                    name: .init("cartArrayUpdated"), 
                    object: nil)
    // Do any additional setup after loading the view.
}
  

Затем внутри CartViewController просто создайте функцию, которая обрабатывает обновление вашего tableview

 @objc func refresh() {
    tableView.reloadData()
}
  

Также не забудьте удалить CartViewController as observer, когда он больше не нужен. После viewDidLoad добавьте следующее

 deinit {
    NotificationCenter.default.removeObserver(self)
}
  

Также я согласен с @Leo Dabus объявление этого массива как глобальной переменной является плохой практикой. У вас должно быть это внутри CartViewController , тогда все, что вам нужно было сделать, это просто

 var cartArray =  [Cart(name: "initial", thumbnails: "sgA1.jpg", price: "initial", quantity: 0)] {
    didSet { 
       tableView.reloadData()
    }
}
  

Комментарии:

1. Я создал cartArray вне класса, чтобы получить к нему доступ в других классах, поэтому он говорит, что TableView является неразрешенным идентификатором. Как мне это исправить? Я также пытался использовать протокол, но не уверен точно, как его использовать. Если бы вы могли дать мне какой-нибудь код для его реализации, это было бы здорово.