2011-03-19 20 views
5

IB'de kendi UITableViewCell'imi tasarlayabiliyorum. Ancak, IB'de tanımladığım etikete erişmeye çalışırken null ref istisnası almaya devam ediyorum.Arabirim Oluşturucu'dan özel UITableViewCell nasıl kullanılır?

İşte yapıyorum: Interface Builder olarak

:

  • ben "Görünüm" kaldırıldı ve bunun yerine bir UITableViewCell ekledi.
  • UITableViewCell sınıfını "TestCellView" olarak değiştirildi.
  • Hücre için bir UILabel eklendi.
  • TestCellView için bir "oLblText" çıkışı eklendi ve UILabel'ı buna bağladı.
  • Sınıfın tanımlayıcısını "TestCellView" olarak değiştirdim.

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; 
     } 
    } 
} 

Uygulamak ** TestCellView.designer.cs ** benim tablonun Kaynakta

[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; 
} 

Lütfen, her hücre için bir UIViewController içeren bir çözüm istemediğimi unutmayın. Bunu yaparken internette birkaç örnek gördüm. Ben sadece toplam overkill olduğunu düşünüyorum.

Neyi yanlış yapıyorum?

cevap

3

Her şeyden önce, bu bir tasarım meselesi. Tablo görünümünde, "Ayarlar" görünümünde olduğu gibi, statik içerikli belirli sayıda hücre yüklüyse, istediğiniz her satır için bir özel hücre oluşturun ve her birini bir çıkışla bağlayın.

  1. UITableViewCell devralır ve her sen Interface Builder unutarak programlı istemek içinde görüntülemek bir sınıf oluşturun: Bu durum söz konusu değilse

    , o zaman iki seçenek var.

  2. , Kontrolör ile yeni bir iPhone Görünüm ekle orada görünümü değiştirmek ve senin yaptığın gibi davranın. Eğer Dosyanın Sahibindeki bir çıkış ile cebini bağlamak zorunda kalacak aslında hariç. Bu denetleyiciyi başlattığınızda, tüm hücrenizin alt görünümleri iyi olur.

O bir overkill değil, ya da en azından, Apple bunu tavsiye eder: click and go to the "Loading Custom Table-View Cells From Nib Files" paragraph

Not: Sadece benzer bir durum vardı ve bunu bu şekilde yaptık yoludur. MonoTouch, bu örneğin, LoadNib şey yok. Sadece tablonun kaynağında GetCell geçersiz kılma içinde bu yapın:

using (CellController controller = new CellController()) 
{ 

    cell = (CustomCell)controller.View; 

} 

Hatta belki UIView yayın yapmak önlemek için CellController nesnesinin içinde extra çıkış beyan ederim.

+2

Ben şimdi o var aynen böyle. Ben sadece bir denetleyiciye sahip olmaktan hoşlanmıyorum. Nedeni: varsayılan hücre stillerini kullanırken bir denetleyicim de yok. Bu yüzden, Apple, NO kontrolörüne ihtiyaç olduğuna karar verdi. Özel hücreler oluştururken, hücre başına bir denetleyiciye sahip olmamızı istiyorlar. – Krumelur

+1

Varsayılan hücre stillerini kullandığınızda, hücreler program aracılığıyla oluşturulduğundan, hiçbir denetleyiciye gerek duyulmuyor. Ancak, genel olarak, bir NIB dosyasından yüklenen, kullanıcı arabirimi nesnelerini kullanmak istersiniz. Sadece bir NIB dosyasındaki özel bir hücreyi bırakmak yeterli değildir. Dosyanın Sahibi ile bir şekilde bağlanmalıdır, ki bu durumda UIViewController olmalıdır. –

1

Bunu denetleyin link. Bu, özel bir TableViewCell oluşturmak için çok ilginç bir makaledir. Hatanın Monotouch tarafından sağlanan xib'in asenkron yüklenmesinden kaynaklandığını düşünüyorum.

Böyle kendi costructor sağlamak zorunda

: Bu yardımcı olur

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

Umut!

+0

Burada verilen linki göre, yukarıda girdiğiniz kod örneği doğru değil. linkte örnek ** kontrolör ** uygulanması içeride değil hücre uygulaması içine LoadNib çağırır. –

3

Uç takılı olana kadar herhangi bir çıkış noktasına başvuruda bulunamazsınız. "NIB'iniz yüklendi, artık alanlara erişebilirsiniz" diyeceğiniz bir yöntem var. Bu noktaya kadar, bu nesnelere başvurmak her zaman boşa dönecektir.

İlgili konular