Nasıl UILabel tıklanabilir hale getirilir?


136

UILabel'i tıklanabilir yapmak istiyorum.

Bunu denedim, ama çalışmıyor:

class DetailViewController: UIViewController {

    @IBOutlet weak var tripDetails: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        ...
        let tap = UITapGestureRecognizer(target: self, action: Selector("tapFunction:"))
        tripDetails.addGestureRecognizer(tap)
    }

    func tapFunction(sender:UITapGestureRecognizer) {
        print("tap working")
    }
}

4
Senin çerçeven ne UILabel? Etiketin çerçevesine dokunduğunuzdan emin misiniz? Bir var mı UIViewsetiketi kaplayan? Etiket için userInteractionEnabledayarlanmış mı True?
JAL

UILabel IBOutlet'inizin Nib veya Storyboard'unuzdan bağlandığından emin olun
aahrens

Yanıtlar:


178

Eğer sete denediniz isUserInteractionEnablediçin trueüzerine tripDetailsetiket? Bu çalışmalı.


1
Cevap için teşekkürler!!! Burada hala UITapGestureRecognizer hakkında başka bir sorunum var: stackoverflow.com/questions/33659078/…
Daniele B

Muslukta arka plan rengini değiştirmeye çalışıyorum ama parmağımı bıraktığımda musluk olayı ateşliyor. Rötuş olayını yakalamanın bir yolu var mı? Uzun basış aradığım şey değil.
Numan Karaaslan

109

Swift 3 Güncellemesi

değiştirmek

Selector("tapFunction:")

ile

#selector(DetailViewController.tapFunction)

Misal:

class DetailViewController: UIViewController {

    @IBOutlet weak var tripDetails: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        ...

        let tap = UITapGestureRecognizer(target: self, action: #selector(DetailViewController.tapFunction))
        tripDetails.isUserInteractionEnabled = true
        tripDetails.addGestureRecognizer(tap)
    }

    @objc
    func tapFunction(sender:UITapGestureRecognizer) {
        print("tap working")
    }
}

Ben musluk fonksiyonu ile açıklama vardı @objc.
Scott D. Strader

46

SWIFT 4 Güncellemesi

 @IBOutlet weak var tripDetails: UILabel!

 override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: #selector(GameViewController.tapFunction))
    tripDetails.isUserInteractionEnabled = true
    tripDetails.addGestureRecognizer(tap)
}

@objc func tapFunction(sender:UITapGestureRecognizer) {

    print("tap working")
}

15

Swift 3 Güncellemesi

yourLabel.isUserInteractionEnabled = true

1
bu bana yardımcı olmadı. Ben bir tableview bir etiket üzerinde yapmaya çalışıyorum
Pavlos

Storyboard'da önceden ayarlanmış olsa bile burada da çalışmasını sağladı.
brainray

14

Hızlı 5

@Liorco ancak ihtiyaca Benzer yerine @objc ile @IBAction .

class DetailViewController: UIViewController {

    @IBOutlet weak var tripDetails: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        ...

        let tap = UITapGestureRecognizer(target: self, action: #selector(DetailViewController.tapFunction))
        tripDetails.isUserInteractionEnabled = true
        tripDetails.addGestureRecognizer(tap)
    }

    @IBAction func tapFunction(sender: UITapGestureRecognizer) {
        print("tap working")
    }
}

Bu Xcode 10.2 üzerinde çalışıyor.


2
@IBActionyöntemi yalnızca Xcode'un Interface Builder'ına (dolayısıyla IB) göstermek için gereklidir. Aynı şekilde davranır, @objcancak kodlarla jestleri veya diğer eylemleri eklerseniz @objcek açıklamayı kullanmalısınız
Adam

7

İyi ve kullanışlı bir çözüm:

ViewController'ınızda:

@IBOutlet weak var label: LabelButton!

override func viewDidLoad() {
    super.viewDidLoad()

    self.label.onClick = {
        // TODO
    }
}

Bunu ViewController'ınıza veya başka bir .swift dosyasına (ör. CustomView.swift) yerleştirebilirsiniz:

@IBDesignable class LabelButton: UILabel {
    var onClick: () -> Void = {}
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        onClick()
    }
}

Film şeridi'nde Etiket'i seçin ve alan sınıfındaki "Kimlik Denetçisi" nde sağ bölmede LabelButton'u seçin.

"Özellik Etkileşimi Etkin" Etiket Özellik Denetçisinde etkinleştirmeyi unutmayın


3

Bu etiketin kullanıcı etkileşimini etkinleştirmeniz gerekir .....

Örneğin;

yourLabel.userInteractionEnabled = true


bu bana yardımcı olmadı. Ben bir tableview bir etiket üzerinde yapmaya çalışıyorum
Pavlos

2

Hızlı 3.0 için Harekete uzun basma süresini de değiştirebilirsiniz

label.isUserInteractionEnabled = true
let longPress:UILongPressGestureRecognizer = UILongPressGestureRecognizer.init(target: self, action: #selector(userDragged(gesture:))) 
longPress.minimumPressDuration = 0.2
label.addGestureRecognizer(longPress)

1

Benim yaptığım gibi gözden kaçırmak oldukça kolay, ama kullanmak UITapGestureRecognizeryerine unutmayın UIGestureRecognizer.


-4

Yukarıdaki çözümde açıklandığı gibi, önce kullanıcı etkileşimini etkinleştirmeli ve dokunma hareketini eklemelisiniz

bu kod kullanılarak test edilmiştir

Swift4 - Xcode 9.2

yourlabel.isUserInteractionEnabled = true
yourlabel.addGestureRecognizer(UITapGestureRecognizer(){
                //TODO 
            })

Bunu Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'denediğimde anladım.
lionello
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.