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")
    }
}
Daniele B
sumber
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.

Claudiu Iordache
sumber
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")
    }
}
liorco.dll
sumber
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")
}
Xcodian Solangi
sumber
15

Pembaruan Swift 3

yourLabel.isUserInteractionEnabled = true
Indrajit Sinh Rayjada
sumber
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.

Jerry Chong
sumber
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"

peneliti
sumber
3

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

Misalnya

yourLabel.userInteractionEnabled = true

Abhishek
sumber
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)
DURGESH
sumber
1

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

Devbot10
sumber
-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 
            })
Amr Marah
sumber
Saya mendapatkan Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'ketika saya mencoba ini.
lionello