2011-03-19 14 views
5

मैं आईबी में अपना खुद का UITableViewCell डिज़ाइन करने में सक्षम होना चाहता हूं। लेकिन आईबी में परिभाषित लेबल तक पहुंचने का प्रयास करते समय मुझे एक शून्य अपवाद अपवाद मिल रहा है।इंटरफ़ेस बिल्डर से कस्टम UITableViewCell का उपयोग कैसे करें?

यहाँ मैं क्या कर रहा है:

इंटरफ़ेस बिल्डर में:

  • मैं "देखें" हटा दिया और इसके बदले एक UITableViewCell गयी।
  • UITableViewCell की कक्षा को "TestCellView" में बदल दिया।
  • सेल में एक UILabel जोड़ा गया।
  • "TestCellView पर आउटलेट जोड़ा गया और UILabel को उससे जोड़ा गया।
  • कक्षा के पहचानकर्ता को "TestCellView" में बदल दिया।

लागू TestCellView.xib.cs

public partial class TestCellView : UITableViewCell 
{ 
    public TestCellView(string sKey) : base(UITableViewCellStyle.Default, sKey) 
    { 
    } 

    public TestCellView(IntPtr oHandle) : base(oHandle) 
    { 
    } 

    public string TestText 
    { 
     get 
     { 
      return this.oLblText.Text; 
     } 
     set 
     { 
         // HERE I get the null ref exception! 
      this.oLblText.Text = value; 
     } 
    } 
} 

** TestCellView.designer.cs **

[MonoTouch.Foundation.Register("TestCellView")] 
public partial class TestCellView { 

    private MonoTouch.UIKit.UILabel __mt_oLblText; 

    #pragma warning disable 0169 
    [MonoTouch.Foundation.Connect("oLblText")] 
    private MonoTouch.UIKit.UILabel oLblText { 
     get { 
      this.__mt_oLblText = ((MonoTouch.UIKit.UILabel)(this.GetNativeField("oLblText"))); 
      return this.__mt_oLblText; 
     } 
     set { 
      this.__mt_oLblText = value; 
      this.SetNativeField("oLblText", value); 
     } 
    } 
} 

मेरी मेज के स्रोत में:

public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath) 
{ 
    TestCellView oCell = (TestCellView)tableView.DequeueReusableCell("myCell"); 
    if(oCell == null) 
    { 
     // I suppose this is wrong but how to do it correctly? 
       // this == my UITableViewSource. 
       NSBundle.MainBundle.LoadNib("TestCellView", this, null); 
     oCell = new TestCellView("myCell"); 
    } 
    oCell.TestText = "Cell " + indexPath.Row; 
    return oCell; 
} 

कृपया ध्यान दें कि मुझे ऐसा समाधान नहीं चाहिए जिसमें प्रत्येक सेल के लिए UIViewController शामिल हो। मैंने वेब पर कुछ उदाहरण देखे हैं। मुझे लगता है कि यह कुल ओवरकिल है।

मैं क्या गलत कर रहा हूं?

उत्तर

3

सबसे पहले, यह डिजाइन की बात है। यदि आपकी तालिका दृश्य हमेशा "सामग्री" दृश्य की तरह स्थिर सामग्री वाले कोशिकाओं की एक विशिष्ट संख्या लोड करता है, तो अपनी इच्छित प्रत्येक पंक्ति के लिए एक कस्टम सेल बनाएं और प्रत्येक को आउटलेट से कनेक्ट करें।

  1. एक वर्ग है कि UITableViewCell विरासत और हर देखने आप प्रोग्राम उस में चाहते हैं, इंटरफ़ेस बिल्डर भूल बनाएँ:

    अगर ऐसा नहीं है, तो आप दो विकल्प हैं।

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

यह एक overkill नहीं है, या कम से कम, एप्पल यह सिफारिश की गई है: click and go to the "Loading Custom Table-View Cells From Nib Files" paragraph

पुनश्च: बस एक ऐसी ही स्थिति थी और इस तरह से मैं इसे किया है है। मोनो टच में, इस उदाहरण के लिए, आपको LoadNib कुछ भी नहीं है। बस अपनी मेज के स्रोत में GetCell ओवरराइड अंदर ऐसा करते हैं:

using (CellController controller = new CellController()) 
{ 

    cell = (CustomCell)controller.View; 

} 

शायद UIView से कास्टिंग से बचने के लिए CellController ऑब्जेक्ट के अंदर एक अतिरिक्त आउटलेट घोषणा करते हैं।

+2

यह ठीक है कि मेरे पास अब यह है। मुझे बस नियंत्रक होने की इच्छा नहीं है। कारण यह है: डिफ़ॉल्ट सेल शैलियों का उपयोग करते समय मेरे पास नियंत्रक नहीं होता है। तो वहां, ऐप्पल ने फैसला किया कि कोई नियंत्रक की आवश्यकता नहीं है। जब कस्टम कोशिकाओं को creaing, वे चाहते हैं कि हम प्रति सेल एक नियंत्रक है। – Krumelur

+1

हाँ जब आप डिफ़ॉल्ट सेल शैलियों का उपयोग कर रहे हैं, तब से कोई नियंत्रक की आवश्यकता नहीं होती है क्योंकि कोशिकाओं को प्रोग्रामेटिक रूप से बनाया जा रहा है। लेकिन आप सामान्य रूप से सेल, उपयोगकर्ता इंटरफ़ेस ऑब्जेक्ट्स का उपयोग करना चाहते हैं, जो कि एनआईबी फ़ाइल से लोड होते हैं। एनआईबी फ़ाइल में बस कस्टम सेल छोड़ना पर्याप्त नहीं है। इसे किसी भी तरह से अपने फ़ाइल के मालिक से जोड़ा जाना चाहिए, इस मामले में, एक UIViewController होना चाहिए। –

1

यह link देखें। एक कस्टम TableViewCell बनाने के लिए यह एक बहुत ही रोचक लेख है। मुझे लगता है कि त्रुटि मोनोटच द्वारा प्रदान की गई xib की एसिंक्रोनस लोडिंग के कारण है।

आप इस तरह अपने खुद के costructor प्रदान करने के लिए है:

public TestCellView(string sKey) //: base(UITableViewCellStyle.Default, sKey) 
{ 
    MonoTouch.Foundation.NSBundle.MainBundle.LoadNib ("YOUR NIBNAME", this, null); 
} 

आशा इस मदद करता है!

+0

आपके द्वारा प्रदान किए गए लिंक के मुताबिक, ऊपर दर्ज कोड उदाहरण सही नहीं है। लिंक में उदाहरण ** नियंत्रक ** कार्यान्वयन के अंदर लोडनिब को कॉल करता है और सेल कार्यान्वयन के अंदर नहीं। –

3

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

संबंधित मुद्दे