วิธีสร้าง UILabel แบบคลิกได้


142

ฉันต้องการสร้าง UILabel แบบคลิกได้

ฉันได้ลองแล้ว แต่ไม่ได้ผล:

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
กรอบของคุณUILabelคืออะไร? แน่ใจหรือว่ากำลังแตะอยู่ในกรอบป้าย คุณมีUIViewsป้ายปิดหรือไม่? มีการuserInteractionEnabledตั้งค่าให้Trueสำหรับป้ายกำกับหรือไม่
JAL

ตรวจสอบให้แน่ใจว่า UILabel IBOutlet ของคุณเชื่อมต่อกับ Nib หรือ Storyboard ของคุณ
aahrens

คำตอบ:


183

คุณพยายามตั้งค่าisUserInteractionEnabledเป็นtrueบนtripDetailsฉลากหรือไม่? สิ่งนี้ควรใช้งานได้


1
ขอบคุณสำหรับคำตอบ!!! ที่นี่ฉันยังมีปัญหาอื่นเกี่ยวกับ UITapGestureRecognizer: stackoverflow.com/questions/33659078/…
Daniele B

ฉันพยายามเปลี่ยนสีพื้นหลังเมื่อแตะ แต่เหตุการณ์การแตะกำลังเริ่มทำงานเมื่อฉันปล่อยนิ้ว มีวิธีจับทัชดาวน์ไหม? การกดแบบยาวไม่ใช่สิ่งที่ฉันกำลังมองหา
Numan Karaaslan

115

อัปเดต Swift 3

แทนที่

Selector("tapFunction:")

ด้วย

#selector(DetailViewController.tapFunction)

ตัวอย่าง:

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

ฉันต้องใส่คำอธิบายประกอบเกี่ยวกับฟังก์ชันการแตะด้วย@objc.
Scott D.Strader

48

อัปเดต 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

สวิฟต์ 5

คล้ายกับ @liorco แต่จำเป็นต้องเปลี่ยน@objcกับ@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")
    }
}

สิ่งนี้ทำงานบน Xcode 10.2


2
@IBActionจำเป็นเพื่อให้เมธอดแสดงกับ Interface Builder ของ Xcode เท่านั้น (ด้วยเหตุนี้จึงเป็น IB) นอกจากนี้ยังทำหน้าที่เป็น@objcแต่ถ้าคุณเพิ่มท่าทางหรือการกระทำอื่น ๆ ด้วยรหัสคุณควรใช้@objcคำอธิบายประกอบ
Adam

7

ทางออกที่ดีและสะดวก:

ใน ViewController ของคุณ:

@IBOutlet weak var label: LabelButton!

override func viewDidLoad() {
    super.viewDidLoad()

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

คุณสามารถวางสิ่งนี้ไว้ใน ViewController ของคุณหรือในไฟล์. Swift อื่น (เช่น CustomView.swift):

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

ใน Storyboard ให้เลือก Label และในบานหน้าต่างด้านขวาใน "Identity Inspector" ในคลาสฟิลด์เลือก LabelButton

อย่าลืมเปิดใช้งานใน Label Attribute Inspector "User Interaction Enabled"


3

คุณต้องเปิดใช้งานการโต้ตอบกับผู้ใช้ของป้ายกำกับนั้น .....

สำหรับเช่น

yourLabel.userInteractionEnabled = true


สิ่งนี้ไม่ได้ช่วยฉัน ฉันพยายามทำบนฉลากใน tableview
Pavlos

2

สำหรับ swift 3.0 คุณยังสามารถเปลี่ยนระยะเวลาการกดแบบยาวด้วยท่าทาง

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

1

สวยง่ายต่อการมองเห็นเหมือนผม แต่ไม่ลืมที่จะใช้มากกว่าUITapGestureRecognizerUIGestureRecognizer


-4

ตามที่อธิบายไว้ในโซลูชันข้างต้นคุณควรเปิดใช้งานการโต้ตอบกับผู้ใช้ก่อนและเพิ่มท่าทางสัมผัส

รหัสนี้ได้รับการทดสอบโดยใช้ไฟล์

Swift4 - Xcode 9.2

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

ฉันได้รับCannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'เมื่อฉันลองสิ่งนี้
lionello
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.