Не работает реализация когда получаю доступ к свойству


#1

Добрый день!
Есть xib ячейка, которая инициализируется в классе NewPlaceTableViewController, ячейка имеет внутри себя UIStackView, со своим классом RatingControl, в котором присутствует реализация кастомного рейтинга,
40%20PM

@IBDesignable class RatingControl: UIStackView, RatingProtocol {

// MARK: - Preperties
var rating = 0 {
    didSet {
        updateButtonSelectionState()
    }
}
private var ratingButtons = [UIButton]()
@IBInspectable var startSize: CGSize = CGSize(width: 44.0, height: 44.0) {
    didSet {
        setupView()
    }
}
@IBInspectable var startCount: Int = 5 {
    didSet {
        setupView()
    }
}

// MARK: - Initialization
override init(frame: CGRect) {
    super.init(frame: frame)
    setupView()
}

required init(coder: NSCoder) {
    super.init(coder: coder)
    setupView()
}

// MARK: - Button Action
@objc func ratingButtonAction(button: UIButton) {
    guard let index = ratingButtons.firstIndex(of: button) else { return }
    let selectedRating = index + 1
    
    if selectedRating == rating {
        rating = 0
    } else {
        rating = selectedRating
    }
    print("rating \(rating)")
}

// MARK: - Private Methods
private func setupView() {
    for button in ratingButtons {
        removeArrangedSubview(button)
        button.removeFromSuperview()
    }
    
    ratingButtons.removeAll()
    
    let bundle = Bundle(for: type(of: self))
    let emptyStar = UIImage(named: "emptyStar", in: bundle, compatibleWith: self.traitCollection)
    let filledStar = UIImage(named: "filledStar", in: bundle, compatibleWith: self.traitCollection)
    let highlithedStar = UIImage(named: "highlithedStar", in: bundle, compatibleWith: self.traitCollection)
    
    for _ in 0..<startCount {
        let button = UIButton()
        button.setImage(emptyStar, for: .normal)
        button.setImage(filledStar, for: .selected)
        button.setImage(highlithedStar, for: .highlighted)
        button.setImage(highlithedStar, for: [.highlighted, .selected])
        
        button.setSize(width: startSize.width, height: startSize.height)
        button.addTarget(self, action: #selector(ratingButtonAction), for: .touchUpInside)
        addArrangedSubview(button)
        ratingButtons.append(button)
    }
    updateButtonSelectionState()
}

private func updateButtonSelectionState() {
    for (index, button) in ratingButtons.enumerated() {
        button.isSelected = index < rating
    }
}

}

В классе NewPlaceTableViewController я пытаюсь через созданное свойство

var ratingControl: RatingControl = {
let rating = RatingControl()
return rating
}()

отловить значение свойства rating из RatingControl в ячейке, присвоив

ratingControl.rating = cell.ratingControl.rating

Далее при нажатии на определенную кнопку записывается в модель

let newPlace = FavoritePlace(name: placeNameTextField.text!, location: placeLocationTextField.text, type: placeTypeTextField.text, imageData: imageData, rating: ratingControl.rating)

свойство ratingControl.rating в модель попадает значение 0, так как я просто перехватил начальную инициализацию свойства, пробовал делегатами отлавливать и синглетоном напрямую обращаться к свойству rating в RatingControl, но безуспешно, как я могу решить эту проблему?

проект https://github.com/Constantine1995/MyFavoritePlaces


#2

понял, я должен был свойство delegate = self не у экземпляра var ratingControl: RatingControl? вызывать, а в ячейке cell.delegate = self