Как я могу использовать #selector для вызова функции в другом классе, когда требуется параметр self? - PullRequest
0 голосов
/ 21 октября 2019

Кажется, я не могу удалить функции локальных классов из каждого из моих классов, потому что я не могу понять, как использовать #selector для вызова функции, которая находится в другом классе (когда Self является обязательным параметром).

В настоящее время я вызываю локальную функцию, которая вызывает нормально:

class Tickets: UIViewController {

    override func viewWillAppear(_ animated: Bool) {

        NotificationCenter.default.addObserver(self, selector: #selector(setDataIcon), name: NSNotification.Name(rawValue: "ActiveSyncRequestInitiated"), object: nil)
}

    @objc func setDataIcon() {
        global.setDataIcon(self) // called via #selector above, works
    }
}

Я бы предпочел удалить локальную функцию setDataIcon и вызвать ее через селектор как

    #selector(global.setDataIcon(self)) // doesn't compile!

Но я получаю сообщение об ошибке «Аргумент« #selector »не относится к методу, свойству или инициализатору« @objc »

1 Ответ

0 голосов
/ 21 октября 2019

Слово #selector может вызывать только методы, отмеченные @objc. Если вы удалите этот метод или спецификатор @objc, #selector не сможет вызвать его. Вот почему вы получаете сообщение об ошибке.

Если вы хотите, чтобы уведомление, наблюдаемое в классе A, выполняло код в классе B, я вижу несколько вариантов:

1.) Создайте экземпляркласса B внутри класса A, а код в setDataIcon внутри метода класса A вызывает функцию из вашего экземпляра класса B.

2.) В setDataIcon отправьте уведомление, наблюдаемое классом B, изатем зарегистрируйте класс B, чтобы наблюдать это уведомление, и попросите класс B выполнить код при соблюдении.

3.) Используйте методы делегата. Прежде чем регистрироваться для наблюдения за уведомлением, убедитесь, что вы создаете экземпляр класса B и назначаете его делегату класса A. Затем внутри setDataIcon делегат (который является классом B) вызывает метод делегата.

Если посмотреть на ваши комментарии, если 'global' является экземпляром класса B внутри класса A, метод setDataIcon внутри global также должен быть квалифицирован как @objc. (вариант 1)

...