Как заставить UILabel реагировать на касание?

Я обнаружил, что могу создавать UILabel намного быстрее, чем UITextField, и я планирую использовать UILabel большую часть времени для своего приложения для отображения данных.

Короче говоря, я хочу, чтобы пользователь нажимал на UILabel и мой обратный вызов отвечал на это. Это возможно?

Спасибо.

89
задан Happy 22 August 2011 в 22:27
поделиться

1 ответ

Я лично предпочитаю метод записи расширения для 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
}

Это может потенциально вызвать некоторые утечки памяти, которым я верю, но я не определил, как лучше всего разрешить их все же.

0
ответ дан 24 November 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: