Невозможно подключить IBAction в Xcode

Когда я перетаскиваю из кнопки на раскадровке свой файл Swift файла диспетчера просмотра, я получаю возможность вставлять коллекцию Outlet или Outlet.

Аналогично, если я создаю IBAction вручную и попытаюсь подключить его к кнопке на раскадровке, я не могу подключить их.

Эта проблема появляется только в одном из моих проектов, но это происходит на всех раскадровках в моем проекте.

Похоже на ошибку Xcode, но, возможно, кто-то знает об обходном пути.

(Трудно сказать, но элемент, перемещаемый на скриншоте, - это кнопка.)

enter image description here

Ответы

Ответ 1

У меня очень похожая проблема в моем проекте Swift, который сводил меня с ума.

Оказалось, что проблема смешивания пользовательского протокола в расширении UIButton имеет свойство @IBInspectable. Подробнее см. Ниже.

Наконец-то я узнал, что, поскольку у меня есть следующий код в моем проекте: (авторское право распространяется на Кевина Макней: https://www.iphonelife.com/blog/31369/swift-programming-101-mastering-dynamic-type-ios)

protocol DynamicTypeChangeHandler {

    var typeObserver: Bool {get set}
}

extension UIButton: DynamicTypeChangeHandler {
    @IBInspectable var typeObserver: Bool {
        // ...
    }
}

Если я удалю либо принятие протокола из расширения, либо ключевое слово @IBInspectable, я могу снова настроить действия в Interface Builder. Явное безумие. Xcode < 3

Ответ 2

Вы можете попробовать изменить аргумент @IBAction от (_ sender: Any) до (_ sender: UIButton) или (_ sender: AnyObject), но вручную.

Это может сработать.

Ответ 3

Я не могу говорить об основной причине - в XCode всегда что-то ломается, но вы всегда можете вручную записывать IBAction вручную, @IBAction func(sender: UIButton) { } в вашем представлении/контроллере, а затем управлять перетаскиванием из элемента раскадровки в само действие. Если это не работает, попробуйте связать с node, созданный IBAction на краю вашего кода, назад к раскадровке. Это работает для меня, когда XCode перестает работать.

Ответ 4

Убедитесь, что вы выбрали Automatic.

enter image description here

Ответ 5

Эта ошибка действительно сумасшедшая. Из-за этого я потерял часы. До сих пор я нашел 2 причины, и я опубликую здесь, может быть, кто-то прочитает и будет полезен:

  • Если кто-то использует BonMot pod, это одна из возможных причин. Если вы удалите его, вернется IBAction.

  • Любое расширение на UIButton или UIBarButtonItem может также вызвать это. Прокомментируйте расширение, и IBAction вернется. Счастливое кодирование.


UPDATE: BonMot исправил эту проблему в 4.0.2

Ответ 6

Это, по-видимому, известная проблема на форумах Apple, но я не знаю, работает ли над ней Apple:

https://forums.developer.apple.com/message/216258

Вот что я сделал для обходного пути.

  • Перейдите в мой подфайл и закомментируйте библиотеку pod (в моем случае, ReactiveKit Bond), которая делает расширение, вызывающее проблему.
  • Сделайте pod update, чтобы удалить модуль из проекта.
  • Вернитесь назад и выполните мои подключения IBAction в IB, как обычно. Сделайте как можно больше усилий для повышения эффективности.
  • Наконец вернитесь назад и раскомментируйте свою библиотеку pod и выполните еще pod update до reimport контейнеры.
  • Проверьте, установив точку останова в своих новых функциях IBAction, чтобы проверить, что ваши соединения работают.

Ответ 7

Для меня я пытался подключить несколько кнопок к одному IBAction, ни одно из решений не работало до тех пор, пока я не переключил свою подпись метода, чтобы указать, что отправитель был UIButton, а не Any

@IBAction func buttonPressed(_ sender: UIButton) {
}

Ответ 8

Если расширение вызывает проблему, то вместо прямого расширения UIButton пользовательские типы, например, создают расширение CustomButton вместо UIButton

typealias CustomButton = UIButton
extension CustomButton { }

Ответ 9

У меня была такая же проблема, но это было потому, что я пытался подключить ImageView к IBAction (простите меня, не уверен, что моя терминология верна). Я удалил объект ImageView и заменил его кнопкой и Затем IBAction стал вариантом, а не только IBOutlet и Outlet Collection.

Ответ 10

Для меня это был FUIButton (пользовательский от SAP Fiori), вызывающий такую ​​же проблему. В моем собственном коде не указано ни одного контейнера или расширения UIButton (в дополнение к SAP UIButton). Cmd + Alt + Shift + K, DerivedData Clean тоже не помогло. @IBAction не был доступен в Interface Builder, пока я не изменил свой класс Button на простой UIButton.

И... вуаля! та-да!

Ответ 11

Хорошо, это 2019 год, и эта проблема все еще возникает, и если кто-то здесь все еще ищет решение, единственный способ заставить его работать - это:

  • Напишите свою функцию IBAction в расширении
  • В Интерфейсном Разработчике нажмите "Владелец файла" или основной вид
  • На правой панели инструментов щелкните Инспектор соединений.

List item

  • перейдите вниз по списку и найдите созданный вами IBAction, который сидит там один и не связан ни с чем
  • Нажмите на пустой кружок рядом с ним и перетащите к вашей грустной грустной кнопке

enter image description here

  • Видите, что печальная кнопка теперь снова счастлива и связана с чем-то