Я обнаружил, что могу создавать UILabel намного быстрее, чем UITextField, и я планирую использовать UILabel большую часть времени для своего приложения для отображения данных.
Короче говоря, я хочу, чтобы пользователь нажимал на UILabel и мой обратный вызов отвечал на это. Это возможно?
Спасибо.
Я лично предпочитаю метод записи расширения для UILabel. Это - то, что я использую.
import UIKit
extension UILabel {
/**
* A map of actions, mapped as [ instanceIdentifier : action ].
*/
private static var _tapHandlers = [String:(()->Void)]()
/**
* Retrieve the address for this UILabel as a String.
*/
private func getAddressAsString() -> String {
let addr = Unmanaged.passUnretained(self).toOpaque()
return "\(addr)"
}
/**
* Set the on tapped event for the label
*/
func setOnTapped(_ handler: @escaping (()->Void)) {
UILabel._tapHandlers[getAddressAsString()] = handler
let gr = UITapGestureRecognizer(target: self, action: #selector(onTapped))
gr.numberOfTapsRequired = 1
self.addGestureRecognizer(gr)
self.isUserInteractionEnabled = true
}
/**
* Handle the tap event.
*/
@objc private func onTapped() {
UILabel._tapHandlers[self.getAddressAsString()]?()
}
}
Вы тогда использовали бы его как это от любого экземпляра UILabel:
myLabel.setOnTapped {
// do something
}
Это может потенциально вызвать некоторые утечки памяти, которым я верю, но я не определил, как лучше всего разрешить их все же.