UILabel में टच इवेंट को संभालना और इसे IBAction तक हुक करना


101

ठीक है, तो मेरे पास एक UILabelइंटरफ़ेस बिल्डर है जो "टैप टू स्टार्ट" के कुछ डिफ़ॉल्ट पाठ प्रदर्शित करता है।

जब उपयोगकर्ता टैप करता है तो UILabelमैं चाहता हूं कि यह एक आईबीएशन विधि को ट्रिगर करे: -(IBAction)next;जो कुछ नया कहने के लिए लेबल पर पाठ को अपडेट करता है।
यह वास्तव में सुविधाजनक होगा यदि यह मुझे एक विधि से मेरे लेबल पर एक कनेक्शन खींचने की अनुमति देता है और फिर एक बटन के साथ अंदर का चयन करें। लेकिन अफसोस, कोई सिगार नहीं।

वैसे भी, मुझे लगता है कि मेरा सवाल है, क्या मुझे UILabelयह काम करने के लिए उपवर्ग लेना होगा? या क्या कोई तरीका है जो मैं लेबल पर एक बटन खींच सकता हूं, लेकिन इसे 0% अपारदर्शी बनाएं। या वहाँ एक सरल समाधान मैं याद कर रहा हूँ?

जवाबों:


255

इसकी जांच - पड़ताल करें:

UILabel *label = ...
label.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture =
      [[UITapGestureRecognizer alloc] initWithTarget:self 
                                              action:@selector(labelTap)];
[label addGestureRecognizer:tapGesture];

ट्रिक यूजर इंटरेक्शन को इनेबल करने के लिए है।


1
यदि मेरे पास कई लेबल हैं तो क्या होगा? मैं कैसे अंतर कर सकता हूं जो एक टैप किया गया था?
शिक्षार्थी

1
@ लेनर टैग संपत्ति का प्रयास करें। लेबलटैप का उपयोग करना सुनिश्चित करें: लेबलटैप के बजाय। और उपयोग - (शून्य) लेबलटैप: (आईडी) प्रेषक ;;
थेजेंडी

1
@thedjaney प्रेषक UITapGestureRecognizer है, UILabel नहीं है
h4labs

TapGestureRecognizer अंदर टच अप के समान नहीं है, और मानव इंटरफ़ेस अनुरूपता और पहुंच खो देता है।

1
@ h4labs आप UITapGestureRecognizer * tapGesture = भेजने वाले का उपयोग कर सकते हैं; उसके बाद tapGesture.view.tag
DJTano

70

यूआईबेल को यूआईवीईवाई से विरासत में मिला है जो यूरीस्पोंडर से विरासत में मिला है। सभी UIresponder ऑब्जेक्ट स्पर्श घटनाओं को संभाल सकते हैं। तो आपकी क्लास फाइल में जो आपके विचार के बारे में जानता है (जिसमें UIlabel शामिल है) कार्यान्वयन:

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event;

इंटरफ़ेस बिल्डर में यूबिल के टैग मूल्य निर्धारित किया है। जब आपके टचबेजन विधि में स्पर्श होते हैं, तो उस टैग का मान देखें जिसमें टैग संबंधित है:

UITouch *touch = [touches anyObject];

if(touch.view.tag == MY_TAG_VAL)
label.text = @"new text";

आप अपने कोड फ़ाइल को अपने बिल्डर फ़ाइल से UILabel ऑब्जेक्ट के साथ इंटरफ़ेस बिल्डर में IBOutlet उपसर्ग के साथ घोषित करके कनेक्ट करें:

IBOutlet UILabel *label;

फिर इंटरफ़ेस बिल्डर में आप उन्हें कनेक्ट कर सकते हैं।


31
एक नोट, आपको यह सुनिश्चित करना होगा कि आप इंटरफ़ेस बिल्डर में "उपयोगकर्ता सहभागिता सक्षम" की जांच करें, या यह काम नहीं करेगा।
midas06

मैंने इस पद्धति से एक समस्या को मारा। व्यू कंट्रोलर को सीधे लोड करने पर यह ठीक काम करता है, लेकिन जब मैंने एक नेवी कंट्रोलर बनाया, तो कंट्रोलर को लेबल को नेवी कंट्रोलर पर धकेल दिया और फिर उसे प्रदर्शित करते हुए, टच को अब लेबल नहीं लगता। कोई विचार?
midas06

यदि यह एक ही दृश्य नियंत्रक वर्ग है जिसे आप धक्का दे रहे हैं तो इसे काम करना चाहिए। लगता है कि कुछ अन्य छोटी समस्या हो सकती है। शायद एक और सवाल शुरू करें और कुछ कोड पोस्ट करें
रिमूवर

5
इसी तरह की विधि जिसके लिए टैग की आवश्यकता नहीं है, बस यह जांचना है कि टच.व्यू उस लेबल के लिए आपके द्वारा निर्धारित आउटलेट के बराबर है या नहीं। मुझे यह पसंद है, क्योंकि इसका मतलब है कि मुझे टैग का ट्रैक रखने की आवश्यकता नहीं है।
defragged

महान समाधान। मेरा सुझाव है कि आप किसी भी टैग को 0 होने के लिए सेट न करें क्योंकि कहीं भी क्लिक करने पर इसका टैग मान 0 होता है। ऐसा इसलिए है क्योंकि आपके विचार में सबसे अधिक टैग का मान 0 होगा। अन्यथा, आप अपने दृश्य का टैग सेट कर सकते हैं -1 जैसा कुछ और फिर आप 0 के टैग मान का उपयोग कहीं और कर सकते हैं यानी एक बटन
केविनएल

30

आप एक UIButton का उपयोग कर सकते हैं, इसे पारदर्शी बना सकते हैं, यानी बिना छवि के कस्टम प्रकार, और इस पर एक UILabel (केंद्रित) जोड़ सकते हैं। फिर सामान्य बटन घटनाओं को तार करें।


मैं मानता हूं, कस्टम बटन प्रकार आपको एक यूआईबेल प्रकार उपयोगकर्ता अनुभव देना चाहिए।
स्टिट्ज

2
+1, अच्छा और सरल। मैंने opactiy 0 के लिए एक सामान्य बटन सेट करने से पहले यह कोशिश की थी जो काम नहीं करता था, लेकिन टाइप को कस्टम में बदलने के लिए टिप ने पूरी तरह से काम किया।
ब्रायन Moeskau

अपारदर्शिता बटन और उसके सभी साक्षात्कारों को प्रभावित करेगी, इसलिए अस्पष्टता = 0 पूरी चीज़ को अदृश्य कर देगी।
Eiko

10
ओह। यह इस थ्रेड में अन्य समाधानों की तुलना में एक हैक है। यदि आप किसी लेबल पर टैप जेस्चर को पहचानना चाहते हैं, तो एक लेबल पर टैप जेस्चर पहचानकर्ता का उपयोग करें। (देखें कि यह कैसे पढ़ता है जैसे कि यह इसके लिए था?)
जेम्स बूचर

यह एक बहुत दूर तक बेहतर समाधान है क्योंकि बटन सिर्फ टैप (शुरू) के बजाय टचअपिनसाइड संभालते हैं।

17

स्विफ्ट 3

आपके पास एक IBOutlet है

@IBOutlet var label: UILabel!

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

label.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(userDidTapLabel(tapGestureRecognizer:)))
label.addGestureRecognizer(tapGesture)

और आखिर में टैप को हैंडल करें

func userDidTapLabel(tapGestureRecognizer: UITapGestureRecognizer) {
  // Your code goes here
}

2
मुझे यह काम करने के लिए userDidTapLabel में @objc जोड़ना था। एक स्विफ्ट 4 चीज हो सकती है।
POSIX- आज्ञाकारी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.