UILabel को कैसे क्लिक करें?


136

मैं एक 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 या स्टोरीबोर्ड से
आहरित है

जवाबों:


178

क्या आपने लेबल पर सेट isUserInteractionEnabledकरने का प्रयास किया है ? यह काम करना चाहिए।truetripDetails


1
जवाब के लिए धन्यवाद!!! यहाँ मैं अभी भी UITapGestureRecognizer के बारे में एक और मुद्दा है: stackoverflow.com/questions/33659078/…
Daniele B

मैं नल पर पृष्ठभूमि का रंग बदलने की कोशिश कर रहा हूं, लेकिन जब मैं अपनी उंगली छोड़ता हूं, तो नल घटना बंद हो जाती है। क्या टच डाउन इवेंट को पकड़ने का एक तरीका है? लॉन्ग प्रेस वह नहीं है जिसकी मुझे तलाश है।
नुमान कारासलान

109

स्विफ्ट 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
स्कॉट डी। स्ट्रैडर

46

स्विफ्ट 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

स्विफ्ट 3 अपडेट

yourLabel.isUserInteractionEnabled = true

1
इससे मुझे मदद नहीं मिली। मैं इसे एक टेबलव्यू में एक लेबल पर करने की कोशिश कर रहा हूं
Pavlos

यहां तक ​​कि यह काम कर रहा है, भले ही यह स्टोरीबोर्ड में पहले से ही सेट किया गया हो।
ब्रेनरे

14

स्विफ्ट 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केवल Xcode के इंटरफ़ेस बिल्डर (इसलिए IB) की विधि को उजागर करने की आवश्यकता है। यह भी कार्य करता है @objcलेकिन यदि आप कोड के साथ इशारों या अन्य क्रियाओं को जोड़ते हैं तो आपको @objcएनोटेशन का उपयोग करना चाहिए
एडम

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

स्टोरीबोर्ड में लेबल का चयन करें और फ़ील्ड क्लास में "आइडेंटिटी इंस्पेक्टर" में राइट पेन पर लेबलबटन का चयन करें।

लेबल अभिभावक निरीक्षक "उपयोगकर्ता सहभागिता सक्षम" में सक्षम करने के लिए मत भूलना


3

आपको उस लेबल के उपयोगकर्ता इंटरैक्शन को सक्षम करने की आवश्यकता है .....

उदाहरण के लिए

yourLabel.userInteractionEnabled = true


इससे मुझे मदद नहीं मिली। मैं इसे एक टेबलव्यू में एक लेबल पर करने की कोशिश कर रहा हूं
Pavlos

2

स्विफ्ट 3.0 के लिए आप जेस्चर लॉन्ग प्रेस टाइम अवधि भी बदल सकते हैं

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

1

बहुत आसान है जैसे मैंने किया, लेकिन इसके UITapGestureRecognizerबजाय उपयोग करना न भूलें UIGestureRecognizer


-4

जैसा कि उपरोक्त समाधान में वर्णित है, आपको पहले उपयोगकर्ता इंटरैक्शन को सक्षम करना चाहिए और टैप जेस्चर को जोड़ना चाहिए

इस कोड का उपयोग करके परीक्षण किया गया है

स्विफ्ट 4 - एक्सकोड 9.2

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

मुझे लगता है Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'जब मैं यह कोशिश करता हूं।
सिंहल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.