it-roy-ru.com

UIButton в Swift не регистрирует касания

Я пытаюсь создать UIButton, используя Swift. Он прекрасно компилируется, и я вижу свою кнопку в симуляторе, но когда я нажимаю на нее, ничего не происходит. Это код, который я использую:

let settings = UIButton()
settings.addTarget(self, action: "touchedSet:", forControlEvents: UIControlEvents.TouchUpInside)
settings.setTitle("Settings", forState: .Normal)
settings.frame = CGRectMake(0, 530, 150, 50)
scrollView.addSubview(settings)

В том же классе есть функция touchedSet:

func touchedSet(sender: UIButton!) {
    println("You tapped the button")
}

Я использую симулятор, так как у меня нет устройства iOS 8.0, может ли это быть проблемой?

Спасибо!

24
Phillip

Я вижу, это старый вопрос, но я вчера столкнулся с очень похожей проблемой. Мои кнопки были выделены на ощупь, но не запускали действие.

У меня есть два контроллера представления. Один вид охватывает другой вид, а кнопка находится сверху.

например.

  • Rootviewcontroller имеет вид сзади

  • Topviewcontroller имеет вид сверху

Кнопка в виде сверху не вызывает действие, если я не добавляю topviewcontroler как childviewcontroller для rootviewcontroller. После добавления topviewcontroller в качестве childviewcontroller он начал работать.

Итак, вкратце: просто попробуйте добавить контроллер представления кнопок superview в качестве childviewcontroller в родительский просмотр viewcontroller следующим способом

func addChildViewController(_ childController: UIViewController)
15
Mert

Селекторы - это структура, которая должна быть создана.

Сделай это так ...

Обновлено для Swift 4

settingsButton.addTarget(self, action: #selector(showSettings), for: .touchUpInside)

Это должно сделать это.

8
Fogmeister

Для тех, кто также застрял в учебнике:

Я столкнулся с той же проблемой, когда следовал Apple, «Начните разрабатывать приложения для iOS (Swift)». Оказалось, что я наблюдал за этими строками кода в руководстве

override var intrinsicContentSize : CGSize {
    return CGSize(width: 240, height: 44)
}

Добавление их в мой RatingControl устранило проблему.

5
ouven

В симуляторе иногда он не распознает селектор. Кажется, есть ошибка. Я просто изменил название действия (селектор), и это сработало.

let buttonPuzzle:UIButton = UIButton(frame: CGRectMake(100, 400, 100, 50))
buttonPuzzle.backgroundColor = UIColor.greenColor()
buttonPuzzle.setTitle("Puzzle", forState: UIControlState.Normal)
buttonPuzzle.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)
buttonPuzzle.tag = 22;
self.view.addSubview(buttonPuzzle)

Функция выбора здесь:

func buttonAction(sender:UIButton!)
{
    var btnsendtag:UIButton = sender
    if btnsendtag.tag == 22 {
        //println("Button tapped tag 22")
    }   
}
5
user1671097

У меня была похожая проблема, когда у меня был subViewController с соответствующими кнопками и tapHandlers, и я хотел поместить это в стек в отдельном superViewController ..

Это привело к тому, что ни один из tapHandlers не сработал, и вместо решения проблемы вместо использования addArrangedSubview (subViewController.view) я также использовал addChildViewController(subViewController) в суперпредставлении, чтобы позволить childViewController продолжать работать как viewController, а не просто как представление.

3
Lord Fresh

Я вижу только одну проблему: вы должны установить action с Selector следующим образом:

settings.addTarget(self, action: Selector("touchedSet:"), forControlEvents: UIControlEvents.TouchUpInside)

Не забудьте вставить :, если вам нужно передать параметры в функцию.

1
Tchelow

У меня была эта проблема, когда родительский вид моей кнопки имеет isUserInteractionEnabled == false. Все подпредставления будут иметь тот же userInteraction, что и их родительское представление. Поэтому я только что добавил эту строку parentView.isUserInteractionEnabled = true, и проблема исчезла. Надеюсь, это кому-нибудь поможет.

1
Bohdan Savych

Я нашел похожий пример для Swift 2 и адаптирован для Swift 3. Протестировано, что он работает очень хорошо. Я надеюсь, что это помогает.

// http://lab.dejaworks.com/ios-Swift-3-playground-uibutton-action
// Trevor D. Beydag

import UIKit
import PlaygroundSupport
class Responder : NSObject {
    func action() {
        print("Button pressed!")
    }
}

let containerView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 300.0,    height: 600.0))
PlaygroundPage.current.liveView = containerView
let responder = Responder()

let button = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
button.backgroundColor = UIColor.green
button.setTitle("TEST", for: .normal)
button.addTarget(responder, action: #selector(Responder.action), for: .touchUpInside)
containerView.addSubview(button)
0
Trevor

Поэтому вы должны использовать следующую строку

settings.userInteractionEnabled = true
0
Samrez Ikram

Проблема с этим учебником от Apple заключается в том, как они помещают UIView (RatingControl) в StackView, что неверно. UIView (RatingControl) должен быть вне StackView. Итак, решение: 1. Перетащите UIView (RatingControl) за пределы StackView 2. Установите ограничения для новой позиции RatingControl - Ведущая маржа к Контейнеру равна нулю - Трейлинг маржи к Контейнеру равен нулю - Верхнее поле для StackView равно нулю

С этими новыми ограничениями теперь RatingControl будет иметь то же значение, что и Container, независимо от размера экрана устройства, и всегда будет позади StackView, где появится селектор фотографий.

Я надеюсь, что это поможет вам, ребята.

0
Carlos Lago González

Убедитесь, что вы связываете свою кнопку с переменной экземпляра IBOutlet в своем коде, если вы используете раскадровку.

0
Peng90

Вы сказали в том же классе. Убедитесь, что сам код кнопки находится в viewDidLoad (), и действие должно быть вне его, но внутри класса, если вы работаете с представлением.

0
elito25

У меня была та же проблема при реализации UIButton и SearchBar в представлении контейнера (UIView) . В моем случае причиной была проблема ограничения. Возникла проблема с searchBar, и поэтому набор функций никогда не вызывался.

Вы можете увидеть, есть ли какая-либо из кнопки «Отладка просмотра иерархии». (проблема ограничения отображается в виде фиолетового предупреждения)

(env: iOS12, xcode10.1)

0
simotunes

Старый вопрос, но думал, что помогу другим, ищущим эту проблему. Во-первых, я не совсем уверен, что это правильно, поэтому, пожалуйста, поправьте меня, если я ошибаюсь.

Но если вы неправильно установите селектор, приложение будет аварийно завершать работу при нажатии кнопки, поскольку оно подписано на селектор, который не существует. Это означает, что ваш селектор работает. Я предполагаю, что что-то еще блокирует событие касания, предполагая UIButton.enabled = true и UIButton.userInteractionEnabled = true. Обычно вы можете проверить это долгим нажатием кнопки и посмотреть, ударит ли она. Если это произойдет, то вы добавите UIGestureRecognizer где-нибудь, который сначала будет обрабатывать попадания. Также может быть UIScrollView, который задерживает сенсорный ввод (в Инспекторе есть флажок для этого).

Надеюсь, что это кому-то поможет, и надеюсь, что это точно.

0
ClockWise