Должен ли метод Selector быть в тех же случаях, что и наблюдатель? - PullRequest
0 голосов
/ 14 марта 2019

Обычно код addObserver и Selector method tag with @Objc кодируются в одном и том же экземпляре (экземплярный класс).

Можно передать Selector из другого экземпляра в addObserver?

Причина для этого заключается в том, что Selector в большинстве случаев ведет себя как обратный вызов.Некоторые из методов обратного вызова обычно используются и могут быть хорошо закодированы в класс CommonCallBack, пример использования может быть таким:

class SomeViewController{

  override func viewDidLoad() {
    ...

    let common = CommonCallback()

    NotificationCenter.default.addObserver(
      self, 
      selector: #selector(common.methodA), 
      name: "notificationName", 
      object: nil
    )

  }

}

class CommonCallback{

  @Objc func methodA() { 
    // doing A 
  }

}

Проблема в том, что я продолжаю получать unrecognized selector sent to instance

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Вы также можете достичь этого, сделав так

class SomeViewController {

    override func viewDidLoad() {
        let common = CommonCallback()
        common.enableObserver = true
    }

}

class CommonCallback{
    var enableObserver : Bool!
    override func viewDidLoad() {
        if enableObserver {
            NotificationCenter.default.addObserver(
                self,
                selector: #selector(common.methodA),
                name: "notificationName",
                object: nil
            )
        }
    }
    @objc func methodA() {
        // Your code here
    }
}
0 голосов
/ 14 марта 2019

Я узнал, где пошло не так, если код.Аргумент observer должен быть в том же классе, что и Selector method, поэтому вместо:

NotificationCenter.default.addObserver(
  self, 
  selector: #selector(common.methodA), 
  name: "notificationName", 
  object: nil
)

он должен быть:

NotificationCenter.default.addObserver(
  common, 
  selector: #selector(common.methodA), 
  name: "notificationName", 
  object: nil
)

Это вызовет CommonCallback.methodA вместоSomeViewController.methodA

...