Создание простой метки, которая переключает текст при нажатии в Swift

Swift 4.0 iOS 11.x Как раз когда вы думаете, что разбираетесь в вещах, вы понимаете, что упустили что-то критическое. Хотел создать ярлык, который изменился сам, когда вы нажали на него. Создан этот подкласс метки.

import UIKit

class TapText: UILabel {

private var changableValues: String = "NESW"
private var currentPosition:Int = 0

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
    print("required ")
    let tap = UITapGestureRecognizer(target: self, action:  Selector(("tapFunction:")))
    self.addGestureRecognizer(tap)
}

required override init(frame: CGRect) {
    super.init(frame: frame)
     print("required override")
    let tap = UITapGestureRecognizer(target: self, action:  Selector(("tapFunction:")))
    self.addGestureRecognizer(tap)
}

func tapFunction(sender:UITapGestureRecognizer) {
    print("tapped")
    self.text = String(Array(changableValues)[currentPosition])
    if currentPosition < changableValues.count {
        currentPosition += 1
    } else {
        currentPosition = 0
    }
}

}

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

2018-03-12 11: 14: 40.283502 + 0100 Blah [952: 382749] - [Blah.TapText tapFunction:]: нераспознанный селектор отправлен в экземпляр 0x111a57700 2018-03-12 11: 14: 40.285213 + 0100 QRCodeReader [952: 382749 ] * Нагрузочное приложение из - за неперехваченное исключение 'NSInvalidArgumentException', причина: '-[Blah.TapText tapFunction]: непризнанный селектор направил к экземпляру 0x111a57700' * стек Первый бросок вызова: (0x184633164 0x18387c528 0x184640628 0x18dfae188 0x184638b10 0x18451dccc 0x18e28aca4 0x18e28f298 0x18dd67a14 0x18dc1eb50 0x18e278b08 0x18e278678 0x18e2777d4 0x18dc1ce5c 0x18dbede7c 0x18e54330c 0x18e545898 0x18e53e7b0 0x1845db77c 0x1845db6fc 0x1845daf84 0x1845d8b5c 0x1844f8c58 0x1863a4f84 0x18dc515c4 0x100887c3c 0x18401856c) LibC++abi.dylib: оканчивающиеся неперехваченного исключением типа NSException

--- добавил директиву _ bar и @objc, теперь работает... выглядит так...

required override init(frame: CGRect) {
    super.init(frame: frame)
     print("fcuk12032018 required override")
    let tap = UITapGestureRecognizer(target: self, action:  #selector(tapFunction))
    self.addGestureRecognizer(tap)
}

@objc func tapFunction(_ sender:UITapGestureRecognizer) {
    print("fcuk12032018 tapped")
    self.text = String(Array(changableValues)[currentPosition])
    if currentPosition < changableValues.count - 1 {
        currentPosition += 1
    } else {
        currentPosition = 0
    }
}

СПАСИБО Nitish!

2 ответа

Решение

Задавать userInteraction в true в инициализаторе. затем UILabel будет отвечать на жесты.
По вопросу сбоя: Попробуйте установить функцию как func tapFunction(_sender: UITapGestureRecognizer), И установите селектор с помощью #selector.

Кажется, вы пропустили userInteractionEnabled в вашем коде. Вы можете добавить его в свой viewController следующим образом:

final class MyViewController: UIViewController {
   @IBOutlet private var myLabel: TapText!

    override func viewDidLoad() {
        super.viewDidLoad()

        myLabel.userInteractionEnabled = true
}

Или прямо в вашем пользовательском классе:

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
    print("required ")
    self.userInteractionEnabled = true
    let tap = UITapGestureRecognizer(target: self, action:  Selector(("tapFunction:")))
    self.addGestureRecognizer(tap)
}
Другие вопросы по тегам