Я пытаюсь обновить представление на основе изменения переменной элементов, но cartView равен нулю в didSet

@IBOutlet weak var cartView: UIView!

var items = 0 {
    didSet{
        if items > 0 {
            cartView.isHidden = false
        } else {
            cartView.isHidden = true
        }
    }
    willSet{}
}

Обновление этой переменной из tableviewcell следующим образом -- ''' class ItemListingItemsTableViewCell: UITableViewCell {

@IBOutlet weak var itemTypeImage: UIImageView!


@IBOutlet weak var itemName: UILabel!

@IBOutlet weak var itemPrice: UILabel!

@IBOutlet weak var itemAdd: UIButton!

@IBOutlet weak var itemMinus: UIButton!

@IBOutlet weak var itemPlus: UIButton!

@IBOutlet weak var buttonsview: UIView!


**var itemVC = ItemListingViewController()**



@IBAction func addItemInitial(_ sender: Any) {
    itemAdd.isEnabled = false
    itemAdd.setTitle("1", for: .normal)
    itemAdd.setTitleColor(UIColor.white, for: .normal)
    itemMinus.isHidden = false
    itemPlus.isHidden = false

    itemVC.items = itemVC.items + 1


}'''
0
keerthi 7 Ноя 2019 в 17:55
2
Вероятно, вы устанавливаете items с другого контроллера. Вы должны убедиться, что cartView инициализирован (и загружен) перед его вызовом.
 – 
Mojtaba Hosseini
7 Ноя 2019 в 17:57
Да, я устанавливаю элементы из класса tableviewcell, и viewDidLoad вызывается перед этим наблюдателем свойств
 – 
keerthi
7 Ноя 2019 в 18:02
В основном вам нужно проверить, не является ли ваш cartView nil в начале didSet, например. guard cartView != nil else { return }
 – 
Dennis Pashkov
7 Ноя 2019 в 18:38
Или просто cartView?.isHidden = items <= 0.
 – 
user28434'mstep
7 Ноя 2019 в 18:40

1 ответ

Это потому, что вы изменяете count до того, как будет установлен выход cartView. Я изменил ваш код, проверив, является ли cartView nil, + добавил наблюдателя в сам cartView, поэтому после назначения выхода ваш cartView немедленно обновляет свое состояние на основе count значение свойства.

Также убедитесь, что выход cartView подключен к вашему xib/раскадровке.

@IBOutlet private weak var cartView: UIView! {
    didSet {
        updateCartViewVisibility()
    }
}

var items = 0 {
    didSet{
        updateCartViewVisibility()
    }
}

private func updateCartViewVisibility() {
    guard cartView != nil else { return }
    cartView.isHidden = items == .zero
}
1
Dennis Pashkov 7 Ноя 2019 в 18:52
Спасибо за решение, но и тут все просмотры нулевые. Я не могу понять, что я делаю неправильно
 – 
keerthi
7 Ноя 2019 в 19:08
То ваша розетка не настроена. Проверить раскадровку/xib
 – 
Dennis Pashkov
7 Ноя 2019 в 19:13
Это связано с раскадровкой
 – 
keerthi
7 Ноя 2019 в 19:42
Я понял свою ошибку. В моем tableViewCell я ссылаюсь на контроллер представления, например var itemVC = ItemListingViewController(), поэтому представления не инициализируются. Можете ли вы предложить какой-либо другой способ обновить переменную в контроллере представления из tableviewcell?
 – 
keerthi
8 Ноя 2019 в 09:54
Без кода сложно что-то сказать
 – 
Dennis Pashkov
8 Ноя 2019 в 13:10