2016-09-22 1 views
15

Xcode 8 бугельных и подключить @IBAction неправильно добавляет «WithSender» на подключение инспектора IBXcode 8 перетащить и соединить @IBAction неправильно добавляет «WithSender» на подключение к инспектору IB

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

@IBAction функ tappedConfirmButtonWithSender (отправитель: AnyObject) {}

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

@IBAction функ tappedConfirmButton (отправитель: AnyObject) {}

Является ли это моя вина или это ошибка?

ответ

31

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

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

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

+4

Спасибо за подробное обновление! Я подумал, что такое происходит. Моим текущим ** обходным путем ** является ** подключение @IBAction, а затем просмотр фактической розетки (правый щелчок на элементе представления) в Interface Builder **, который показывает строковый литерал для селектора на черном всплывающем окне ** ** и поэтому мне просто нужно ** обновить имя функции, чтобы оно соответствовало. ** – moyoteg

+0

Спасибо за решение этой проблемы. Я не могу поверить в количество ошибок и проблем, возникших с Xcode 8 и Swift 3. У меня был рабочий проект до обновления. Я потратил не менее 8 часов на то, чтобы сделать работу над проектом после обновления. Все, от недостающих файлов заголовков до неподходящих подзадач, зависит от проблем с автоматической компоновкой IB и теперь обработчиков событий. SMH – itsben

+1

Спасибо за работу вокруг и объяснение, яблоко предложило, что «добавление аннотации @objc» не работает для меня. поэтому я думаю, мы должны придерживаться «_» на данный момент. –

1

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

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

Откройте раскадровку правой кнопкой -> Открыть как -> Исходный код.

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

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

Вот это ...

0

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

Screenshot 1

Ниже работа вокруг этого вопроса:

  1. Delete the outlet connection из файла IB

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

Screenshot 2

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

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

Screenshot 4

0

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

@IBAction func tappedConfirmButton(_ sender: AnyObject) 
{ 

} 

Удачи!