#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 является неразрешенным идентификатором. Как мне это исправить? Я также пытался использовать протокол, но не уверен точно, как его использовать. Если бы вы могли дать мне какой-нибудь код для его реализации, это было бы здорово.