Аргумент #selector не ссылается на метод, свойство или инициализатор ‘@objc’

#swift4 #xcode10

#swift4 #xcode10

Вопрос:

Ниже приведен мой код, я следую онлайн-руководству, но я получаю вышеуказанную ошибку.

 import UIKit
import MultipeerConnectivity

class ViewController: UIViewController, MCBrowserViewControllerDelegate {



    @IBOutlet var xField: [MyImageView]!

    var appDelegate:AppDelegate!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        appDelegate = UIApplication.shared.delegate as? AppDelegate
        appDelegate.mpcHandling.gettingPeerConnection(displayName: UIDevice.current.name)
        appDelegate.mpcHandling.gettingSession()
        appDelegate.mpcHandling.showingSelf(show: true)

        //handling peer state notification

        //getting error for the below mentioned line

        NotificationCenter.default.addObserver(self, selector: #selector("peerChangedNotification:"), name: NSNotification.Name(rawValue: "MPC_DidChangeStateNotification"), object: nil)

        NotificationCenter.default.addObserver(self, selector: Selector("handleReceivedNotification:"), name: NSNotification.Name(rawValue: "MPC_DidReceiveNotification"), object: nil)

        mainLogicField()

    }

    @objc func peerChangedNotification(notification:NSNotification){
        let userInfo = NSDictionary(dictionary: notification.userInfo!)

        let state = userInfo.object(forKey: "state") as! Int

        if state != MCSessionState.connecting.rawValue{
            //Now we inform user that we have connected
            self.navigationItem.title = "Connected Successfully"
        }
    }


    @IBAction func getConnected(_ sender: Any) {

        if appDelegate.mpcHandling.gameSession != nil {
            appDelegate.mpcHandling.gettingBrowser()
            appDelegate.mpcHandling.browser.delegate = self

            self.present(appDelegate.mpcHandling.browser, animated: true, completion: nil
            )

        }

    }




    func mainLogicField() {
        for index in 0 ... xField.count - 1 {

            let recognizeGestureTouch = UITapGestureRecognizer(target: self, action: "fieldTapped")

            recognizeGestureTouch.numberOfTapsRequired = 1

            xField[index].addGestureRecognizer(recognizeGestureTouch)
        }
    }

    func browserViewControllerDidFinish(_ browserViewController: MCBrowserViewController) {
        appDelegate.mpcHandling.browser.dismiss(animated: true, completion: nil)
    }

    func browserViewControllerWasCancelled(_ browserViewController: MCBrowserViewController) {
        appDelegate.mpcHandling.browser.dismiss(animated: true, completion: nil)
    }

}
  

Не уверен, что не так, поскольку я также использовал #selector и @objc для своей функции.
В онлайн-руководстве только что использовался NotificationCenter.default.addObserver(self, селектор: «peerChangedNotification:», имя: NSNotification.Имя (rawValue: «MPC_DidChangeStateNotification»), объект: ноль)
без добавления #selector, но если я удалю #selector, то он выдает мне предупреждение о том, что «Ни один метод не объявлен с помощью селектора Objective-C ‘peerChangedNotification'».
Я пытаюсь подключить 2 устройства с помощью mutipeer

Комментарии:

1. Вы неправильно используете синтаксис селектора.

2. Подсказка: #selector не принимает строку.

Ответ №1:

Selector() : он получает строку / строковый литерал в качестве параметра. Он использовался ранее и #selector является обновленным определением.

#selector : Вы пытаетесь передать строку в #selector , тогда как она принимает ссылку на функцию типа Objective-C. Правильный пример:

 NotificationCenter.default.addObserver(self, selector: #selector(peerChangedNotification(notification:)), name: NSNotification.Name("MPC_DidChangeStateNotification"), object: nil)