Làm thế nào để tạo một UILabel có thể nhấp?


136

Tôi muốn làm cho một UILabel có thể nhấp.

Tôi đã thử điều này, nhưng nó không hoạt động:

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
Khung của bạn là UILabelgì? Bạn có chắc là bạn đang chạm vào khung của nhãn không? Bạn có UIViewsbao gồm các nhãn? Được userInteractionEnabledđặt thành Truenhãn?
JAL

Hãy chắc chắn rằng UILabel IBOutlet của bạn được nối từ
Nib

Câu trả lời:


178

Bạn đã cố gắng thiết lập isUserInteractionEnabledđể truetrên tripDetailsnhãn? Điều này nên làm việc.


1
cảm ơn vì câu trả lời !!! Ở đây tôi vẫn còn một vấn đề khác về UITapGestureRecognizer: stackoverflow.com/questions/33659078/ợi
Daniele B

Tôi đang cố gắng thay đổi màu nền trên tap nhưng sự kiện tap sẽ kích hoạt khi tôi thả ngón tay ra. Có cách nào để bắt sự kiện không? Báo chí dài không phải là những gì tôi đang tìm kiếm.
Numan Karaaslan

109

Cập nhật Swift 3

Thay thế

Selector("tapFunction:")

với

#selector(DetailViewController.tapFunction)

Thí dụ:

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

Tôi đã phải chú thích chức năng nhấn với @objc.
Scott D. Strader

46

Cập nhật 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

Cập nhật Swift 3

yourLabel.isUserInteractionEnabled = true

1
Điều này đã không giúp tôi. Tôi đang cố gắng làm điều đó trên một nhãn trong một cái bàn
Pavlos

làm cho nó hoạt động ở đây là tốt, ngay cả khi nó đã được đặt trong Storyboard.
brainray

14

Swift 5

Tương tự như @liorco, nhưng cần thay thế @objc bằng @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")
    }
}

Điều này đang làm việc trên Xcode 10.2.


2
@IBActionchỉ cần hiển thị phương thức cho Trình tạo giao diện của Xcode (do đó là IB). Nó cũng hoạt động như @objcnhưng nếu bạn thêm các cử chỉ hoặc hành động khác bằng mã, bạn nên sử dụng @objcchú thích
Adam

7

Giải pháp tốt và thuận tiện:

Trong ViewContoder của bạn:

@IBOutlet weak var label: LabelButton!

override func viewDidLoad() {
    super.viewDidLoad()

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

Bạn có thể đặt cái này trong ViewContoder của bạn hoặc trong một tệp .swift khác (ví dụ: CustomView.swift):

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

Trong Storyboard, chọn Label và trên khung bên phải trong "Trình kiểm tra danh tính" trong lớp trường chọn LabelButton.

Đừng quên bật trong Trình kiểm tra thuộc tính nhãn "Đã bật tương tác người dùng"


3

Bạn cần kích hoạt tương tác người dùng của nhãn đó .....

Ví dụ

yourLabel.userInteractionEnabled = true


Điều này đã không giúp tôi. Tôi đang cố gắng làm điều đó trên một nhãn trong một cái bàn
Pavlos

2

Đối với swift 3.0 Bạn cũng có thể thay đổi thời gian nhấn cử chỉ dài

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

1

Khá dễ bỏ qua như tôi đã làm, nhưng đừng quên sử dụng UITapGestureRecognizerhơn là UIGestureRecognizer.


-4

Như được mô tả trong giải pháp trên, bạn nên kích hoạt tương tác người dùng trước và thêm cử chỉ nhấn

mã này đã được thử nghiệm bằng cách sử dụng

Swift4 - Xcode 9.2

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

Tôi nhận được Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'khi tôi thử điều này.
Lionello
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.