नल का जवाब देने के लिए UILabel कैसे प्राप्त करें?


94

मुझे पता चला है कि मैं UITextField की तुलना में UILabel को बहुत तेजी से बना सकता हूं और मैं अपने डेटा डिस्प्ले ऐप के लिए ज्यादातर समय UILabel का उपयोग करने की योजना बना रहा हूं।

हालांकि, एक लंबी कहानी को छोटा करने के लिए, मैं उपयोगकर्ता को यूआईबेल पर टैप करने देना चाहता हूं और मेरी कॉलबैक प्रतिक्रिया है। क्या यह संभव है?

धन्यवाद।


1
आपको userInteractionEnabled = true
onmyway133

जवाबों:


208

आप UITapGestureRecognizerअपने UILabel में एक उदाहरण जोड़ सकते हैं ।

उदाहरण के लिए:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTapped)];
tapGestureRecognizer.numberOfTapsRequired = 1;
[myLabel addGestureRecognizer:tapGestureRecognizer];
myLabel.userInteractionEnabled = YES;

13
अहा, 'userInteractionEnabled' संपत्ति यहां महत्वपूर्ण है (चूंकि अन्य विन्यास स्टोरीबोर्ड में अधिमानतः सेट किया जाना चाहिए और होना चाहिए)। लेबल को डिफ़ॉल्ट रूप से बंद करना ताकि उनके माध्यम से स्पर्श से गुजरना हो - लेकिन इस मामले में उन्हें इशारे पहचानकर्ता को सक्रिय करने के लिए स्पर्श का निरीक्षण करने की आवश्यकता होती है। धन्यवाद!
मार्च्य

1
अच्छा है! मैं सिर्फ एक लेबल पर एक नल फेंक रहा था और पूरी तरह से उपयोगकर्ता बातचीत को सक्षम करने के लिए भूल गया था। धन्यवाद!
माइक क्रेचले

37

यदि आप स्टोरीबोर्ड का उपयोग कर रहे हैं, तो आप बिना किसी अतिरिक्त कोड के स्टोरीबोर्ड में यह पूरी प्रक्रिया कर सकते हैं। स्टोरीबोर्ड में एक लेबल जोड़ें, फिर लेबल पर एक टैप जेस्चर जोड़ें। उपयोगिताओं के फलक में, सुनिश्चित करें कि "उपयोगकर्ता सहभागिता सक्षम" लेबल के लिए जाँच की गई है। टैप जेस्चर से (स्टोरीबोर्ड में आपके व्यू कंट्रोलर के नीचे), ctrl + क्लिक करें और अपनी ViewController.h फ़ाइल में खींचें और एक्शन बनाएं। फिर ViewController.m फ़ाइल में कार्रवाई को लागू करें।


स्टोरीबोर्ड के बिना अकेले इंटरफ़ेस बिल्डर का उपयोग करने की विधि भी उपलब्ध है
गोमिनो

सुनिश्चित करें कि "उपयोगकर्ता इंटरेक्शन सक्षम" को एट्रिब्यूट इंस्पेक्टर में व्यू सेक्शन के तहत चेक किया गया है , न कि एक्सेसिबिलिटी ट्रेट्स।
4

17

स्विफ्ट 3.0

के लिए इशारा शुरू करें tempLabel

tempLabel?.text = "Label"
let tapAction = UITapGestureRecognizer(target: self, action: #selector(self.actionTapped(_:)))
tempLabel?.isUserInteractionEnabled = true
tempLabel?.addGestureRecognizer(tapAction)

कार्रवाई रिसीवर

func actionTapped(_ sender: UITapGestureRecognizer) {
    // code here
}

स्विफ्ट 4.0

के लिए इशारा शुरू करें tempLabel

tempLabel?.text = "Label"
let tapAction = UITapGestureRecognizer(target: self, action:@selector(actionTapped(_:)))
tempLabel?.isUserInteractionEnabled = true
tempLabel?.addGestureRecognizer(tapAction)

कार्रवाई रिसीवर

func actionTapped(_ sender: UITapGestureRecognizer) {
    // code here
}

प्रेषक ऑब्जेक्ट से लेबल टेक्स्ट कैसे प्राप्त करें? दूसरे शब्दों में, प्रेषक की पहचान कैसे करें?
विनील

स्विफ्ट 4 वर्जन में #selector की जगह @selector है।
किर्बी टॉड

8

स्विफ्ट 2.0:

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

override func viewDidLoad() {
    super.viewDidLoad()

    let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
    newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleDouble.rawValue], range: NSMakeRange(4, 4))
    sampleLabel.attributedText = newsString.copy() as? NSAttributedString

    let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapResponse:")
    tapGesture.numberOfTapsRequired = 1
    sampleLabel.userInteractionEnabled =  true
    sampleLabel.addGestureRecognizer(tapGesture)

}
func tapResponse(recognizer: UITapGestureRecognizer) {
    print("tap")
}

4

आप इसके बजाय एक UIButton का उपयोग कर सकते हैं और जो आप चाहते हैं उसके लिए पाठ सेट करें। यदि आप नहीं चाहते हैं तो बटन को बटन की तरह नहीं देखना है


1
जैसा कि माना जाता है, मुझे हमेशा UIButton के वाम-औचित्य वाले बहु-पंक्ति पाठ से परेशानी हुई है। यहां तक ​​कि जब मैं बाईं ओर संरेखण सेट करने के लिए यह अभी भी होता है।
हैप्पी

मैं UIButton एक कोशिश दे दी है और यह बहुत अच्छा है। यह सिर्फ मल्टी-लाइन बटन है जो एक समस्या है। धन्यवाद।
हैप्पी

3

UILable पर टैप जेस्चर जोड़ने के लिए

UITapGestureRecognizer *tapAction = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(lblClick:)];
tapAction.delegate =self;
tapAction.numberOfTapsRequired = 1;

//Enable the lable UserIntraction
lblAction.userInteractionEnabled = YES;
[lblAction addGestureRecognizer:tapAction];   

और चयनकर्ता विधि का आकलन करने के लिए

- (void)lblClick:(UITapGestureRecognizer *)tapGesture {

}

नोट: .h फ़ाइल में UIGestureRecognizerDelegate जोड़ें


2

स्विफ्ट संस्करण: var tapGesture : UITapGestureRecognizer = UITapGestureRecognizer()

फिर अंदर viewDidLoad(), इसे जोड़ें:

  let yourLbl=UILabel(frame: CGRectMake(x,y,width,height)) as UILabel!

    yourLbl.text = "SignUp"
    tapGesture.numberOfTapsRequired = 1
    yourLbl.addGestureRecognizer(tapGesture)
    yourLbl.userInteractionEnabled = true
    tapGesture.addTarget(self, action: "yourLblTapped:")

1

यदि आप अपने बटन में मल्टी लाइन टेक्स्ट का उपयोग करना चाहते हैं तो UILabelमल्टीलाइन टेक्स्ट के साथ बनाएं और अपने बटन में सबव्यू के रूप में जोड़ें।

उदाहरण के लिए:

yourLabel=[Uilabel alloc]init];
yourLabel.frame=yourButtom.Frame;//(frame size should be equal to your button's frame)
[yourButton addSubView:yourLabel]

1

एल्विन जॉर्ज से स्विफ्ट 3

override func viewDidLoad() {
    super.viewDidLoad()
    let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
    newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.styleDouble.rawValue], range: NSMakeRange(4, 4))
    sampleLabel.attributedText = newsString.copy() as? NSAttributedString

    let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.tapResponse))
    tapGesture.numberOfTapsRequired = 1
    sampleLabel.isUserInteractionEnabled =  true
    sampleLabel.addGestureRecognizer(tapGesture)
}

func tapResponse(recognizer: UITapGestureRecognizer) {
    print("tap")
}

0

स्विफ्ट संस्करण इस तरह दिखता है:

func addGestureRecognizerLabel(){
    //Create a instance, in this case I used UITapGestureRecognizer,
    //in the docs you can see all kinds of gestures
    let gestureRecognizer = UITapGestureRecognizer()

    //Gesture configuration
    gestureRecognizer.numberOfTapsRequired = 1
    gestureRecognizer.numberOfTouchesRequired = 1
    /*Add the target (You can use UITapGestureRecognizer's init() for this)
    This method receives two arguments, a target(in this case is my ViewController) 
    and the callback, or function that you want to invoke when the user tap it view)*/
    gestureRecognizer.addTarget(self, action: "showDatePicker")

    //Add this gesture to your view, and "turn on" user interaction
    dateLabel.addGestureRecognizer(gestureRecognizer)
    dateLabel.userInteractionEnabled = true
}

//How you can see, this function is my "callback"
func showDatePicker(){
    //Your code here
    print("Hi, was clicked")
}

//To end just invoke to addGestureRecognizerLabel() when
//your viewDidLoad() method is called

override func viewDidLoad() {
    super.viewDidLoad()
    addGestureRecognizerLabel()
}

0

मैं व्यक्तिगत रूप से UILabel के लिए एक्सटेंशन लिखने की विधि पसंद करता हूं। यही है वह जो मेरे द्वारा उपयोग किया जाता है।

import UIKit

extension UILabel {
    /**
     * A map of actions, mapped as [ instanceIdentifier : action ].
     */
    private static var _tapHandlers = [String:(()->Void)]()

    /**
     * Retrieve the address for this UILabel as a String.
     */
    private func getAddressAsString() -> String {
        let addr = Unmanaged.passUnretained(self).toOpaque()
        return "\(addr)"
    }

    /**
     * Set the on tapped event for the label
     */
    func setOnTapped(_ handler: @escaping (()->Void)) {
        UILabel._tapHandlers[getAddressAsString()] = handler
        let gr = UITapGestureRecognizer(target: self, action: #selector(onTapped))
        gr.numberOfTapsRequired = 1
        self.addGestureRecognizer(gr)
        self.isUserInteractionEnabled = true
    }

    /**
     * Handle the tap event.
     */
    @objc private func onTapped() {
        UILabel._tapHandlers[self.getAddressAsString()]?()
    }
}

फिर आप इसे किसी भी UILabel उदाहरण से उपयोग करेंगे:

myLabel.setOnTapped {
    // do something
}

यह संभावित रूप से कुछ मेमोरी लीक का कारण हो सकता है जो मुझे विश्वास है, लेकिन मैंने अभी तक उन्हें हल करने के लिए सबसे अच्छा कैसे निर्धारित किया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.