2016-09-30 3 views
0

Только что обновлено до Xcode8 с Swift 3. К сожалению, я не могу добавить цель к кнопке, где цель относится к функции в другом классе.Swift 3 #selector и имена типов

class AddToDoViewController { 
    @IBOutlet weak var doneButton: UIButton! 
    var st : SelectorTest! 

    override func viewDidLoad() { 
     st = SelectorTest() 

     st.didTapButtonHandler = { 
     self.doneButton.isSelected = !self.doneButton.isSelected 
     print("self.doneButton.selected=\(self.doneButton.isSelected)") 
     } 

     doneButton.addTarget(self, action: #selector(SelectorTest.didTapTheButton(_:)), for: .touchUpInside) 
    } 
} 


class SelectorTest { 
    typealias ToDoCellDidTapButtonHandler =() -> Void 
    var didTapButtonHandler: ToDoCellDidTapButtonHandler? 

    @objc func didTapTheButton(_ sender: AnyObject) { 
     if let handler = didTapButtonHandler { 
      handler() 
     } 
    } 
} 

В этом случае цель SelectorTest.didTapButton (_ :), который существует в классе SelectorTest. Однако, когда я бегу и нажмите на кнопку Я получаю сообщение об ошибке выполнения:

Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '-[Done.AddToDoViewController didTapTheButton:]: 
unrecognized selector sent to instance 

Поскольку я установил цель на кнопку, чтобы указать на

SelectorTest.didTapTheButton(_:) 

, который, безусловно, существует, почему я получаю время выполнения что он не может найти didTapTheButton(_:) на AddToDoViewController? Особенно, когда я не указал AddToDoViewController.didTapTheButton(_:) в качестве цели?

Done.AddToDoViewController didTapTheButton: 

Я интересно, если #selector игнорирует имя класса и предполагает, что цель находится на классе, который добавил цель кнопки (AddToDoViewController)?

Как установить цель на SelectorTest.didTapTheButton(_:) и во время выполнения выполнить SelectorTest.didTapTheButton(_:) вместо запуска, пытающегося запустить AddToDoViewController.didTapTheButton(_:), который не является настроенной целью и не существует?

ответ

1

Проложить объект SelectorTest класс с addTarget вместо self.

doneButton.addTarget(st, action: #selector(SelectorTest.didTapTheButton(_:)), for: .touchUpInside) 

В addTarget первом целевом параметре является типом Any?

The target object is the object whose action method is called. If you specify nil, UIKit searches the responder chain for an object that responds to the specified action message and delivers the message to that object.

+0

Спасибо, я бы думать, что вы получите ошибку во время компиляции, так как я и SelectorTest не разрешают к тому же классу. – user6902806

+0

Welcome mate :) –

+0

Если в AddToDoViewController: addTarget (self, action: #selector (SelectorTest.didTapTheButton (_:) ... Мне бы хотелось, чтобы я мог получить ошибку/предупреждение о компиляции с самого себя! = SelectorTest. Если вы укажете self, он игнорирует тип класса в #selector. – user6902806

 Смежные вопросы

  • Нет связанных вопросов^_^