iOS, Swift: как добавить / расширить действие нажатия на тот же код контроля рейтинга - PullRequest
0 голосов
/ 04 октября 2018

Я использую https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/ImplementingACustomControl.html для реализации контроля рейтинга.Я использую звездные рейтинги на нескольких экранах.Я хочу реализовать управление кранами на звездах.Как расширить функцию ratingButtonTapped, чтобы я мог что-то сделать по-другому в отдельных контроллерах вида, где я добавил кнопки звездочки?

1 Ответ

0 голосов
/ 05 октября 2018

У вас есть пара опций, когда вы хотите, чтобы один объект (например, контроллер представления) «что-то делал», когда значение / свойство в другом объекте изменяется:

  • шаблон протокола / делегата
  • Центр уведомлений
  • KVO (наблюдение значения ключа)

У каждого есть свои плюсы и минусы.Центр уведомлений можно использовать , но он не очень подходит для этой задачи.

Шаблон протокола / делегата используется очень часто, и это то, что каждый должен изучить.

KVOЭто, пожалуй, лучший вариант для этого конкретного случая, а также (возможно) самый простой в реализации.

Итак, для KVO вы будете сообщать, что вы просматриваете контроллер на O , сохраняйте любые измененияк V методу K ey rating, который является собственностью вашего клиента RatingControl.

Следуя инструкции, сначала измените ваш ratingопределение в RatingControl.swift to:

@objc dynamic var rating = 0 {
    didSet {
        updateButtonSelectionStates()
    }
}

мы просто добавили @objc dynamic спецификаторы.

Затем, в ViewController.swift, добавьте новый var / property и функцию (вы можетепоместите это выше viewDidLoad()):

var ratingObserver: NSKeyValueObservation!

func ratingChanged(to rating: Int) {
    print("Rating was changed to: \(rating)")
    // do whatever else you want here
}

Теперь внутри viewDidLoad() мы реализуем сервер O :

    ratingObserver = ratingControl.observe(\.rating, options: [.new]) {
        [weak self]
        (ratingControl, change) in
        self?.ratingChanged(to: change.newValue ?? 0)
    }

Мы имеемТеперь говорят: всякий раз, когда значение .rating в объекте ratingControl изменяется, отправьте это новое значение в наш ratingChanged() func.Оттуда вы можете делать с ней все, что захотите - хранить, использовать для изменения чего-либо, отправлять на сервер и т. Д.

...