创建一个在 swift 中点击时切换文本的简单标签
Creating a simple label that switches text when tapped in swift
Swift 4.0 iOS 11.x
就在您认为自己掌握了窍门时,您意识到自己错过了一些关键的东西。想要创建一个标签,当您点击它时它会自行改变。创建了标签的这个子 class。
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
}
}
}
我认为可行。正如 Nilish 刚刚指出的那样,我忘记添加 userInteractive,但是当我添加时我遇到了崩溃。
2018-03-12 11:14:40.283502+0100 Blah[952:382749] -[Blah.TapText
tapFunction:]: unrecognized selector sent to instance 0x111a57700
2018-03-12 11:14:40.285213+0100 QRCodeReader[952:382749] *
Terminating app due to uncaught exception
'NSInvalidArgumentException', reason: '-[Blah.TapText tapFunction:]:
unrecognized selector sent to instance 0x111a57700'
* First throw call stack: (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:
terminating with uncaught exception of type 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
}
}
谢谢尼蒂什!
在初始化程序中将 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
}
或直接在您的自定义 class 中:
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)
}
Swift 4.0 iOS 11.x 就在您认为自己掌握了窍门时,您意识到自己错过了一些关键的东西。想要创建一个标签,当您点击它时它会自行改变。创建了标签的这个子 class。
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
}
}
}
我认为可行。正如 Nilish 刚刚指出的那样,我忘记添加 userInteractive,但是当我添加时我遇到了崩溃。
2018-03-12 11:14:40.283502+0100 Blah[952:382749] -[Blah.TapText tapFunction:]: unrecognized selector sent to instance 0x111a57700 2018-03-12 11:14:40.285213+0100 QRCodeReader[952:382749] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Blah.TapText tapFunction:]: unrecognized selector sent to instance 0x111a57700' * First throw call stack: (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: terminating with uncaught exception of type 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
}
}
谢谢尼蒂什!
在初始化程序中将 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
}
或直接在您的自定义 class 中:
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)
}