Bagaimana cara membuat UILabel dapat diklik?


142

Saya ingin membuat UILabel dapat diklik.

Saya telah mencoba ini, tetapi tidak berhasil:

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
Apa bingkai Anda UILabel? Apakah Anda yakin Anda menyentuh bingkai label? Apakah Anda memiliki UIViewslabel penutup? Apakah userInteractionEnableddisetel ke Trueuntuk label?
JAL

Pastikan UILabel IBOutlet Anda terhubung dari Nib atau Storyboard Anda
aahrens

Jawaban:


183

Sudahkah Anda mencoba menyetel isUserInteractionEnabledke truepada tripDetailslabel? Ini seharusnya berhasil.


1
Terima kasih atas jawabannya!!! Di sini saya masih memiliki masalah lain tentang UITapGestureRecognizer: stackoverflow.com/questions/33659078/…
Daniele B

Saya mencoba untuk mengubah warna latar belakang di ketuk tetapi acara ketuk menyala ketika saya melepaskan jari saya. Apakah ada cara untuk menyaksikan acara touch down? Tekan lama bukanlah yang saya cari.
Numan Karaaslan

115

Pembaruan Swift 3

Menggantikan

Selector("tapFunction:")

dengan

#selector(DetailViewController.tapFunction)

Contoh:

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")
    }
}

Saya harus menganotasi fungsi tap dengan @objc.
Scott D. Strader

48

Pembaruan SWIFT 4

 @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

Pembaruan Swift 3

yourLabel.isUserInteractionEnabled = true

1
ini tidak membantu saya. Saya mencoba melakukannya pada label dalam tampilan tabel
Pavlos

membuatnya berfungsi di sini juga, meskipun sudah diatur di Storyboard.
Brainray

15

Cepat 5

Mirip dengan @liorco, tetapi perlu mengganti @objc dengan @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")
    }
}

Ini berfungsi pada Xcode 10.2.


2
@IBActionhanya diperlukan untuk mengekspos metode ke Pembuat Antarmuka Xcode (karenanya IB). Ini juga bertindak seolah- @objcolah tetapi jika Anda menambahkan isyarat atau tindakan lain dengan kode, Anda harus menggunakan @objcanotasi
Adam

7

Solusi yang baik dan nyaman:

Di ViewController Anda:

@IBOutlet weak var label: LabelButton!

override func viewDidLoad() {
    super.viewDidLoad()

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

Anda dapat menempatkan ini di ViewController Anda atau di file .swift lainnya (mis. CustomView.swift):

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

Di Storyboard pilih Label dan di panel kanan di "Identity Inspector" di kelas lapangan pilih LabelButton.

Jangan lupa untuk mengaktifkan di Label Attribute Inspector "User Interaction Enabled"


3

Anda harus mengaktifkan interaksi pengguna dari label itu .....

Misalnya

yourLabel.userInteractionEnabled = true


ini tidak membantu saya. Saya mencoba melakukannya pada label dalam tampilan tabel
Pavlos

2

Untuk swift 3.0 Anda juga dapat mengubah durasi waktu gerakan tekan lama

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

1

Cukup mudah untuk mengabaikan seperti yang kulakukan, tapi jangan lupa untuk menggunakan UITapGestureRecognizerbukan UIGestureRecognizer.


-4

Seperti yang dijelaskan dalam solusi di atas, Anda harus mengaktifkan interaksi pengguna terlebih dahulu dan menambahkan gerakan ketuk

kode ini telah diuji menggunakan

Swift4 - Xcode 9.2.0

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

Saya mendapatkan Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'ketika saya mencoba ini.
lionello
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.