Невозможно подключить 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]()
- Видите, что печальная кнопка теперь снова счастлива и связана с чем-то