Xcode 8 перетащить и подключить @IBAction неправильно добавляет "WithSender" к инспектору подключений IB

Xcode 8 перетащить и подключить @IBAction неправильно добавляет "WithSender" к инспектору подключений IB

Поэтому мне нужно переименовать методы в нечто вроде

@IBAction func tappedConfirmButtonWithSender (отправитель: AnyObject) {}

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

@IBAction func tappedConfirmButton (отправитель: AnyObject) {}

Это моя ошибка или это ошибка?

Ответы

Ответ 1

Я тоже попал в это. Похоже, что это ошибка с устаревшим кодом Swift 2.3 из-за небольшого утечки Swift 3. Я нашел ключевые ответы в форумах dev, а также некоторые дополнительные выводы мной и моим коллегой.

Обход проблемы: Измените аргумент (sender: AnyObject) на (_ sender: AnyObject). Вы получите предупреждение об измененной строке, которую вы можете спокойно игнорировать.

[ ОБНОВЛЕНО - другое обходное решение: Apple ответила на мой отчет об ошибке и предложила другое обходное решение: аннотировать метод @IBAction с помощью @objc. Я еще не подтвердил, что это работает.]

Что происходит: Похоже на ошибку в раскадрах Xcode 8. Моя интерпретация заключается в том, что он ошибочно анализирует методы Swift 2 @IBAction, как если бы они были Swift 3, а затем пытались преобразовать их в Swift 2.

Давайте подробно расскажем! В Swift 3, в отличие от Swift 2, задан метод, объявленный как:

@IBAction func foo(sender: AnyObject)

метка аргумента sender фактически является частью имени метода и включается в вызовы этого метода. В Swift 2, конечно, первый аргумент по умолчанию не получает метки. В Swift 2 вы назовёте foo(myButton); в Swift 3 вы назовёте foo(sender: myButton).

Xcode 8 ошибочно читает эту функцию способом Swift 3. И шаблон для Великого переименования API - это то, что имена метода Swift 2 формы doSomethingWithParam(quuz) переписаны для Swift 3 как doSomething(param: quuz). Xcode предполагает, что то, что произошло здесь, поэтому в ошибочной попытке получить исходное имя Swift 2, оно добавляет WithSender к концу имени метода. Обходное решение подчеркивания работает, делая сигнатуру метода Swift 3 идентичной Swift 2. (Я не знаю, почему аннотация @objc также решает проблему, согласно Apple.)

[Отредактировано несколько раз с изменениями обходных путей.]

Ответ 2

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

Я предлагаю еще одно обходное решение для тех, кто заинтересован.

Откройте раскадровку правой кнопкой мыши → Открыть как → Исходный код.

Найдите свой метод в xml файле и добавьте дополнение WithSender, чтобы оно соответствовало имени вашего метода с именем в вашем классе.

Таким образом, вы можете указать имя метода так, как хотите.

Вот оно...

Ответ 3

У меня была такая же проблема при работе с Xcode 8. It may be bug.

Снимок экрана 1

Ниже приведена работа по этой проблеме:

  • Delete the outlet connection из файла IB

  • Создайте new outlet с помощью Ctrl и перетащите. Откроется всплывающее окно, как показано ниже.

Снимок экрана 2

Выберите соединение как Action и введите name of action. Затем выберите Type.

  1. Нажмите Connect. Это создаст новый IBAction в вашем файле Swift. Хотя круг для IBAction не может быть заполнен, но он подключен.

Снимок экрана 4

Ответ 4

Вы можете попробовать изменить его следующим образом:

@IBAction func tappedConfirmButton(_ sender: AnyObject) 
{

}

Удачи!