UIButton добавить цель без отправителя - PullRequest
0 голосов
/ 25 июня 2019

У меня есть UIDatePicker.После выбора даты я вызываю этот метод

func goToNextScreen(selectedDate: Date) {
    //...
}

Теперь я добавил UIButton.В этом действии кнопки я хочу вызвать тот же метод goToNextScreen без какого-либо значения даты.Значение даты необязательно на следующем экране.Я попробовал следующий код

btn.addTarget(self, action: #selector(goToNextScreen), for: .touchUpInside)//goToNextScreen(_:)

@objc func goToNextScreen(selectedDate: Date? = nil) {
    //...
}

При нажатии кнопки приложение вылетает.

Как решить эту проблему без добавления другого метода?Если это невозможно, почему мой подход не работает

Ответы [ 5 ]

3 голосов
/ 25 июня 2019

Здесь происходит следующее: внутренняя логика кнопки пытается передать отправителя, который является UIButton в параметре Date вашего метода. Однако параметр sender не будет передан, если у вашего метода нет аргументов.

Необязательные параметры в этой ситуации не работают. Однако вы можете создать еще одну перегрузку без параметров для goToNextScreen:

@objc func goToNextScreen() {
    goToNextScreen(selectedDate: nil)
}

и изменить

btn.addTarget(self, action: #selector(goToNextScreen), for: .touchUpInside)

до

btn.addTarget(self, action: #selector(goToNextScreen as () -> Void), for: .touchUpInside)

так, чтобы он отличался между двумя перегрузками.

Обратите внимание, что причина, по которой просто написание #selector(goToNextScreen) является неоднозначной, заключается в том, что у вас есть два метода с именем goToNextScreen, и Swift необходимо разрешить один из них. Но это не может быть только с именем. Вот похожая ситуация:

class Foo {
    @objc func f() {}
    func f(x: Int) {}
    let selector: Selector = #selector(f) // ambiguous use of f
}

Редактировать: Вы не можете сделать это без создания другого метода. Селекторы - негибкие вещи.

2 голосов
/ 25 июня 2019

В этом случае повторно использовать тот же метод невозможно.Вы должны создать новый без параметров или с параметрами UIButton (или более общий тип, часто это Any) и UIEvent.Вот объяснение механизма Target-Action: UIControl .

1 голос
/ 25 июня 2019

Я думал, ты попробуешь это

var selectedDate = Date()
btn.addTarget(self, action: #selector(goToNextScreen), for: .touchUpInside)//goToNextScreen(_:)

@objc func goToNextScreen(_ sender: UIButton) 
{     

   selectedDate ?? self.datePickerDate : Date()    
}
0 голосов
/ 25 июня 2019

Использование Any в качестве sender типа и приведение к Date работает

//add button Target
btn.addTarget(self, action: #selector(goToNextScreen(_:)), for: .touchUpInside)

//Call with date value
goToNextScreen(Date())

@objc func goToNextScreen(_ selectedDate: Any) {
    nextVC.date = selectedDate as? Date
    //...
}
0 голосов
/ 25 июня 2019

sender параметр UIButton приведен к Date, что является причиной сбоя, должно быть UIButton

btn.addTarget(self, action: #selector(btnClicked), for: .touchUpInside)//goToNextScreen(_:) 

@objc func btnClicked(_ sender:UIButton)  {
  // call next here
  goToNextScreen()
}
func goToNextScreen(_ selectedDate: Date? = nil) {
   if let date = selectedDate { }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...