आउटलेट्स को सामग्री iOS को दोहराने से नहीं जोड़ा जा सकता है


144

मैंने अभी एक ऐप बनाया है और स्टोरीबोर्ड पर @ IBOutlet की हुकिंग शुरू की है। मैं उनमें से कुछ को एक बेसिक स्टाइल के साथ UITableViewCell प्रोटोटाइप सेल में लेबल से जोड़ रहा हूं। जब मैं इसे जोड़ता हूं, हालांकि मुझे स्टोरीबोर्ड में यह त्रुटि मिलती है:

TableViewController से UILabel तक डिटेलटेक्स्ट आउटलेट अमान्य है। आउटलेट्स को सामग्री को दोहराने से नहीं जोड़ा जा सकता है।

क्या कोई मेरी मदद कर सकता है? मैंने इसे ऐसे तरीके से स्थापित किया है जो मैं हमेशा सफलतापूर्वक करता हूं लेकिन इस बार इसने मुझे यह त्रुटि दी है।


54
आप UIViewController उपवर्ग में IBOutlet के लिए एक प्रोटोटाइप सेल में एक लेबल कनेक्ट नहीं कर सकते हैं - आपको इसे एक UBOableviewCell उपवर्ग में IBOutlet से कनेक्ट करना होगा।
पॉलव 11

ठीक है धन्यवाद! :) तो बस इतना मैं समझता हूं: क्या आप समझा सकते हैं कि क्यों?
टॉमब्लास्टा

3
क्योंकि आपके पास कोई भी सेल हो सकती है और केवल एक ही व्यू कंट्रोलर हो सकता है - इसलिए सेल का लेबल व्यू कंट्रोलर IBOutlet से जुड़ा होना चाहिए?
पॉलव 11

ठीक है, तो आप एक सिंगल व्यू कंट्रोलर में सेल टेक्स्ट के लिए सेलफोररॉइट इंडेक्सएक्सपैथ का उपयोग क्यों नहीं कर सकते? धन्यवाद!
टॉम्ब्लास्टा

3
क्योंकि आउटलेट्स ऑब्जेक्ट्स (जैसे लेबल) से बंधे होते हैं जब व्यू कंट्रोलर लोड होता है- उस बिंदु पर कोई सेल नहीं होते हैं, इसलिए कोई भी लेबल बाँधने के लिए नहीं होता है, और अगर सेल होते हैं, तो आप जिसे बाँधना चाहते हैं
पॉलव 11

जवाबों:


168

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


9
@ क्या आप उन आउटलेट्स के बारे में अधिक जानकारी जोड़ सकते हैं?
जुआन बोइरो

1
जुआन पाब्लो - वह जो कह रहा है वह यह है कि कस्टम टेबल व्यू सेल का उपयोग करना सामान्य है। आप उस दृश्य के अंदर बाधा के लिए आउटलेट सेट नहीं कर सकते हैं जहां आप सेल का उपयोग कर रहे हैं, इसके बजाय आपको सेलफ़ोरराउट इंडेक्सएक्सपेथ में उदाहरण के लिए ऐसा करने की आवश्यकता होगी - customCell.constraint_row_width.constore = 25.0;
स्टुअर्ट पी।

70

स्टोरीबोर्ड के माध्यम से आपको दो प्रकार के टेबल व्यू सेल उपलब्ध कराए गए हैं, वे डायनामिक प्रोटोटाइप और स्टेटिक सेल हैं

यहाँ छवि विवरण दर्ज करें

1. गतिशील प्रोटोटाइप

नाम से, इस प्रकार का सेल गतिशील रूप से उत्पन्न होता है। वे आपके कोड के माध्यम से नियंत्रित होते हैं, न कि स्टोरीबोर्ड से। तालिका दृश्य के प्रतिनिधि और डेटा स्रोत की सहायता से, आप प्रोग्राम की कोशिकाओं, कोशिकाओं की ऊंचाई, कोशिकाओं के प्रोटोटाइप को निर्दिष्ट कर सकते हैं।

जब आप किसी सेल को अपने टेबल व्यू पर खींचते हैं, तो आप कोशिकाओं का एक प्रोटोटाइप घोषित कर रहे हैं। फिर आप इस प्रोटोटाइप पर कोशिकाओं की किसी भी मात्रा को आधार बना सकते हैं और उन्हें cellForRowविधि के माध्यम से तालिका दृश्य में जोड़ सकते हैं , प्रोग्रामेटिक रूप से। इसका लाभ यह है कि आपको केवल प्रत्येक सेल को बनाने की बजाय 1 प्रोटोटाइप को परिभाषित करने की आवश्यकता है, जो कि उनके द्वारा जोड़े गए सभी दृश्यों के साथ स्वयं (स्थैतिक सेल देखें)।

तो इस मामले में, आप यूआई तत्वों को सेल प्रोटोटाइप पर अपने व्यू कंट्रोलर से कनेक्ट नहीं कर सकते हैं। आपके पास केवल एक व्यू कंट्रोलर ऑब्जेक्ट शुरू होगा, लेकिन आपके पास कई सेल ऑब्जेक्ट्स हो सकते हैं और आपके टेबल व्यू में जोड़े जा सकते हैं। कंट्रोलर को देखने के लिए सेल प्रोटोटाइप को कनेक्ट करने का कोई मतलब नहीं है क्योंकि आप एक व्यू कंट्रोलर कनेक्शन के साथ कई सेल को नियंत्रित नहीं कर सकते हैं। और ऐसा करने पर आपको एक एरर मिलेगी।

यहाँ छवि विवरण दर्ज करें

इस समस्या को ठीक करने के लिए, आपको अपने प्रोटोटाइप लेबल को UITableViewCellऑब्जेक्ट से कनेक्ट करना होगा । A UITableViewCellभी कोशिकाओं का एक प्रोटोटाइप है और आप जितनी चाहें उतनी सेल ऑब्जेक्ट्स आरंभ कर सकते हैं, उनमें से प्रत्येक तब एक दृश्य से जुड़ा होता है जो आपके स्टोरीबोर्ड टेबल सेल प्रोटोटाइप से उत्पन्न होता है।

यहाँ छवि विवरण दर्ज करें

अंत में, अपनी cellForRowविधि में, UITableViewCellकक्षा से कस्टम सेल बनाएं , और लेबल के साथ मज़ेदार चीज़ें करें

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier") as! YourCell

    cell.label.text = "it works!"

    return cell
}

2. स्थैतिक कोशिकाएं

दूसरी ओर, स्थिर कोशिकाएं वास्तव में स्टोरीबोर्ड से कॉन्फ़िगर की जाती हैं। आपको उन्हें बनाने के लिए प्रत्येक और प्रत्येक सेल के लिए यूआई तत्वों को खींचना होगा। आप स्टोरीबोर्ड से सेल नंबर, ऊंचाइयों आदि को नियंत्रित करेंगे। इस मामले में, आपको एक टेबल दृश्य दिखाई देगा जो आपके फोन से बिल्कुल वैसा ही है, जैसा आपने स्टोरीबोर्ड से बनाया है। पेज सेट करने के लिए स्टैटिक सेल का उपयोग अक्सर किया जाता है, जो सेल बहुत अधिक नहीं बदलते हैं।

स्थैतिक सेल के लिए UI तत्वों को नियंत्रित करने के लिए, आपको वास्तव में उन्हें सीधे अपने व्यू कंट्रोलर से कनेक्ट करना होगा, और उन्हें सेट करना होगा।

यहाँ छवि विवरण दर्ज करें


@FangmingNing मेरे कोड में, मैं अभी भी टेक्स्ट लेबल नहीं बदल सकता, मैंने क्लास को सेल से जोड़ा है, जिसे पहचानकर्ता के साथ सही सेल कहा जाता है, लेकिन फिर भी नहीं बदल रहा है
jorge saraiva

@jorgesaraiva चैट रूम में इस बारे में चर्चा करते हैं। chatackstoverflow.com/rooms/159396/discuss
हंगामा

मुझे याद आ रही थी ! YourCell+100
डेनियल स्प्रिंगर

6 महीने के लिए सिर्फ कोड में किसी प्रोजेक्ट पर काम करने के बाद थोड़ा रिफ्रेशर होना हमेशा अच्छा होता है।
ttorbik

धन्यवाद, मेरी समस्या यह है कि मैं इसे सेल के बजाय ViewController से जोड़ रहा हूं।
स्टेला

23

यदि आप सेटिंग्स और अन्य विकल्पों को प्रदर्शित करने के लिए टेबल व्यू का उपयोग कर रहे हैं (जैसे अंतर्निहित सेटिंग्स ऐप करता है), तो आप अपने टेबल व्यू कंटेंट को एटिट्यूड इंस्पेक्टर के तहत स्टेटिक सेल में सेट कर सकते हैं । इसके अलावा, ऐसा करने के लिए, आपको अपने तालिका दृश्य को UITableViewController उदाहरण में एम्बेड करना होगा।


यह सरल और त्वरित तरीका है और स्वीकृत उत्तर होना चाहिए
Jaime Agudo

5

या आपको ऑब्जेक्ट में ऑब्जेक्ट को संदर्भित करने के लिए IBOutlet का उपयोग करने की आवश्यकता नहीं है । आप लेबल को तालिका में टैग मूल्य दे सकते हैं , उदाहरण के लिए टैग को 123 पर सेट करें (यह गुण निरीक्षण द्वारा किया जा सकता है)। तब आप लेबल तक पहुँच सकते हैं

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "someID", for: indexPath)

    let label = cell.viewWithTag(123) as! UILabel //refer the label by Tag

    switch indexPath.row {
    case 0:
        label.text = "Hello World!"
    default:
        label.text = "Default"
    }
    return cell 
}

बहुत आसान और सरल! +100
जूलियन सिल्वेस्ट्री

1

मेरे साथ मेरे पास एक है UIViewcontroller, और उसमें मेरे पास एक कस्टम सेल के साथ एक टेबलव्यू है। मैं UILabel के अपने आउटलेट UItableviewcellको UIViewControllerतत्कालीन त्रुटि में मैप करता हूं ।


अपनी इस कस्टम क्लास में कस्टम सेल क्लास और इंस्टेंट आईबाउट बनायें
Shauket Sheikh

0

जैसा कि ज्यादातर लोगों ने बताया है कि उपवर्ग UITableViewCell इस मुद्दे को हल करता है। लेकिन इसका कारण इसकी अनुमति नहीं है क्योंकि प्रोटोटाइप सेल ( UITableViewCell ) को Apple द्वारा परिभाषित किया गया है और आप इसमें अपना कोई भी आउटलेट नहीं जोड़ सकते हैं।


0

कभी-कभी Xcode सही ढंग से सेल आउटलेट कनेक्शन पर नियंत्रण नहीं कर पाता।

किसी तरह मेरे वर्तमान सेल के लेबल / बटन ने एक और सेल कनेक्ट किया है जो मैं अभी हटा देता हूं और त्रुटि दूर हो जाती है।


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