Нераспознанный селектор, отправленный в экземпляр — кнопка пользовательского интерфейса — Swift

#swift #xcode #uibutton #instance #extension-methods

#swift #xcode #uibutton #экземпляр #расширение-методы

Вопрос:

Я программно создаю кнопку и добавляю действие в расширение моего VC. Кроме того, есть ли лучший способ «удалить» представления, а не скрывать их

 func() setUpViews { 

    //views
    let shadowView = UIView(frame: CGRect(x: Int((UIScreen.main.bounds.width) - CGFloat(width)) / 2, 
    y: (Int(UIScreen.main.bounds.height)), width: width, height: height))
    shadowView.backgroundColor = .none
    let mainView = UIView(frame: CGRect(x: 0, y: 0, width: width, height: height))
    let blackView =  UIView(frame: CGRect(x: 0, y: Int(self.navBar.bounds.height), width: 
    Int(UIScreen.main.bounds.width), height: Int(self.rewardsTableView.bounds.height)))
    shadowView.setUpViewShadowForCell()
    blackView.backgroundColor = .black
    blackView.alpha = 0
    mainView.backgroundColor = color
    mainView.layer.cornerRadius = 10
    mainView.clipsToBounds = true
    mainView.alpha = 1
    


    //close Button
    let closeButton = UIButton(frame: CGRect(x: CGFloat((Int(UIScreen.main.bounds.width) - width) / 
    2), y: CGFloat((Int(UIScreen.main.bounds.height) - height) / 2)   mainView.bounds.height, width: 
    mainView.bounds.width, height: 50))
    closeButton.backgroundColor = UIColor.black.withAlphaComponent(0.8)
    closeButton.tintColor = .white
    closeButton.setTitle("Close", for: .normal)
    closeButton.layer.cornerRadius = 10
    closeButton.addTarget(self, action: Selector(("closeAction")), for: .touchDown)
  

Вот функция, которую я пытаюсь запустить. По сути, я хочу удалить представления из отображения. В настоящее время я скрываю их и получаю сообщение об ошибке «нераспознанный селектор».

     //function to revert back to original, currently hiding
    func closeAction(sender: AnyObject) {
        blackView.isHidden = true
        mainView.isHidden = true
    }

    //adding the views
    self.view.addSubview(shadowView)
    self.view.addSubview(blackView)
    self.view.addSubview(closeButton)
    shadowView.addSubview(mainView)
    self.view.bringSubviewToFront(shadowView)
   
}
  

Пробовал это:

      @objc func closeAction(sender: UIButton, UIView: UIView, UIView2: 
     UIView, 
     Button1: UIButton) {
     UIView.removeFromSuperview()
     UIView2.removeFromSuperview()
     Button1.removeFromSuperview()
     }
  

И в фактической функции:

     closeAction(sender: closeButton, UIView: shadowView, UIView2: 
    mainView, Button1: closeButton)
    closeButton.addTarget(self, action: #selector(closeAction), for: 
    .touchDown)
  

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

1. Какое полное сообщение об ошибке вы получаете?

2. …закрыть действие] нераспознанный селектор, отправленный экземпляру 0x7ffd57c208b0

3. Также понимаю, что мне нужно удалить «кнопку закрытия»

Ответ №1:

Прежде всего, используйте правильный синтаксис

 #selector(closeAction)
  

Во-вторых, вы должны пометить действие как @objc , и рекомендуется использовать реальный тип отправителя, а не неопределенный AnyObject

 @objc func closeAction(_ sender: UIButton) {
  

Чтобы удалить кнопку, удалите ее из своего superView

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

1. хорошо, я понял: (по символу) objc можно использовать только с членами классов, протоколами @objc и конкретными расширениями классов

2. Метод действия должен быть объявлен на верхнем уровне класса, а не внутри другого метода

3. спасибо, вадиан. как только я перемещаю его за пределы класса; как мне вызвать представления, созданные в функции, поскольку расширение не может содержать переменные / константы?

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