Не удается перетащить Действие кнопки в существующую функцию в Xcode 8

У меня странная проблема с Xcode 8. Когда я пытаюсь ctrl + перетащить кнопку на существующую функцию, я не могу создать только новую розетку или действие. Что еще более странно, даже когда я создаю действие с помощью ctrl + drag, я не могу подключить событие к той же кнопке, которую я использовал для создания действия. Значок IB также пуст, как нет связи между действием и кнопкой, но в режиме реального времени щелчок запускает действие. С другой стороны, когда я пытаюсь подключить действие к кнопке от swift к раскадровке, я могу (@IB icon становится "полным"), но затем я получаю исключение в режиме реального времени, нажимая непризнанный селектор myActionWithSender enter image description here enter image description here

9 ответов


в моей версии Xcode IBAction создается автоматически с параметром " Any "вместо"AnyObject". Создание IBAction явно с UIButton вместо этого сработало для меня.


в моем случае вам нужно будет изменить любой на UIButton. Необходимо уточнить, что действие исходит от UIButton.

@IBAction func buttonClicked(_ sender: UIButton) {

}

нажмите на UIButton, затем перейдите в "Инспектор соединений" из области утилит.

нажмите на пустой круг рядом с событием и перетащите линию в тело func.


щелкните правой кнопкой мыши с функцией открыть кнопку в выберите редактирования внутрь тащить ..вы должны попробовать это..


в вашей .быстрое изменение файла:

@IBAction func buttonClicked(sender: UIButton) { // Do something }

to

@IBAction func buttonClicked(z sender: UIButton) { // Do something }

просто добавьте эту маленькую " z " (или любой ярлык, который вы действительно хотите). Я попробовал подчеркнуть"_", и это тоже работает, но это дает предупреждение, поэтому я просто использовал "z", чтобы обойти предупреждение.

Я считаю, что это ошибка в Xcode 8. Где-то (возможно, IB) он ожидает Swift 3-совместимый код, где первый параметр должен иметь метку. Поэтому, когда он видит слово "отправитель" предполагает (ошибочно), что это ярлык. Поэтому добавление ярлыка ("z" в моем случае) делает всех счастливыми.

Swift 2.3 не требует метки. Swift 3 делает. Таким образом, как отметил Ярослав, обновление с 2.3 до 3.0 также обойдет эту проблему. Но если вы проект застрял на 2.3, просто добавление метки, кажется, делает трюк.


изменение отправителя с любого на AnyObject работает для меня


даже в Swift 3 Вы хотели бы изменить с (_ sender: Any) to (_ sender: UIButton) или (_ sender: AnyObject), но вручную.

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


в моем случае у меня была аналогичная раскадровка. Однажды я закрыл ее, а потом ... - нажмите кнопку один раз, чтобы увидеть блоки вокруг него для выравнивания. - Затем щелкните правой кнопкой мыши и перетащите его в ViewController. - Наконец, нажмите / коснитесь, где вы хотите разместить блок кода события внутри ViewController.


чтобы исправить это, мне пришлось обновить язык проекта до Swift 3.0 от Swift 2.3