Подтвердить что ты не робот

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, может быть, проблема?

Спасибо!

4b9b3361

Ответ 1

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

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

например.

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

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

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

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

func addChildViewController(_ childController: UIViewController)

Ответ 2

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

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

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

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

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

Ответ 3

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

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")
    }   
}

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

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

settings.userInteractionEnabled = true

Ответ 11

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

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

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

Ответ 12

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

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

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

Ответ 13

Я нашел аналогичный пример для 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)

Ответ 14

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

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

(env: iOS12, xcode10.1)

Ответ 15

Интересно, что я столкнулся с той же проблемой на самых последних версиях iOS/Xcode (v12.4/v10.3). Оказывается, проблема для меня была LayoutConstraint! Я не шучу. У меня был ведущий ярлык с переключателем uiSwitch справа, и я обнаружил, что мне нужно изменить ограничения между двумя так, чтобы это не было фиксированным постоянным значением в 8 точек (Label-8-Switch-0- |).

Как только я изменил это на "> =", коммутатор смог переключать состояния между вкл/выкл. Смехотворно, почти как если бы он не мог измениться, потому что ему нужно "пространство" (которое, очевидно, меняется), чтобы внести изменения с помощью.

Не уверен, но подайте это как один из тех "хммм?" предметы в вашей памяти.

Еще один элемент (который, на самом деле, не должен иметь значения), это то, что значения valueChanged и tappedUpInside не запускались (верно как на реальной pipeке, так и на симуляторах). Кроме того, они были подключены через раскадровку. Но это не должно иметь значения, насколько я знаю.