Делегат в отдельном классе Swift - PullRequest
0 голосов
/ 09 мая 2018

Я хочу создать делегата в отдельном классе, например:

class MapViewAnnotationDelegate: NSObject, SomeDelegate { //...}

и затем в моем контроллере я хочу назначить:

someView.delegate = MapViewAnnotationDelegate()

но делегат ноль ... как добиться такого эффекта? Я прочел кое-что о сильной стороне в Objective-C, но насколько я знаю, сильная по умолчанию в Swift.

1 Ответ

0 голосов
/ 09 мая 2018

То, что вы делаете, хорошо, но вам нужно что-то, чтобы удержать ваш экземпляр. delegate свойства по традиции weak, поэтому они не гарантируют сохранение объекта. Что-то еще должно сохранить это. Наиболее распространенным решением является добавление свойства к классу, которому принадлежит someView, и присвоение этому свойству MapViewAnnotationDelegate перед назначением его в качестве делегата. Таким образом, он не будет освобожден, пока живет содержащийся объект. Но все, что сохраняет это в порядке

Ваш текущий код в настоящее время делает это:

  • Создать MapViewAnnotationDelegate
  • Назначьте его someView.delegate
  • Обратите внимание, что нет сильных ссылок на MapViewAnnotationDelegate (поскольку someView.delegate является слабой ссылкой)
  • Уничтожить MapViewAnnotationDelegate
  • Установить someView.delegate на ноль

С одной стороны, это может выглядеть так:

class Owner {
    let mapViewAnnotationDelegate = MapViewAnnotationDelegate()

    let someView: ...

    init() {
        someView.delegate = mapViewAnnotationDelegate
    }
}

В этой конфигурации Owner (который является владельцем someView) удерживает делегата в течение его времени жизни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...