如何使用Interface Builder中的自定义UITableViewCell?

时间:2011-03-19 22:33:40

标签: xamarin.ios

我希望能够在IB中设计我自己的UITableViewCell。 但是当我尝试访问我在IB中定义的标签时,我一直得到一个空引用异常。

这就是我正在做的事情:

在Interface Builder中:

  • 我删除了“视图”并添加了一个UITableViewCell。
  • 将UITableViewCell的类更改为“TestCellView”。
  • 在单元格中添加了UILabel。
  • oLblText添加了一个“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 个答案:

答案 0 :(得分:3)

在装入笔尖之前,您无法引用任何插座。有一种方法可以覆盖,它会告诉您“您的NIB已加载,您现在可以访问这些字段”。在此之前,引用这些对象将始终返回null。

答案 1 :(得分:3)

首先,这是一个设计问题。如果您的表格视图始终加载具有静态内容的特定数量的单元格,例如在“设置”视图中,请为您想要的每一行创建一个自定义单元格,并将每个单元格与插座连接。

如果不是这种情况,那么您有两种选择:

  1. 创建一个以编程方式继承UITableViewCell和您想要的每个视图的类,忘记Interface Builder。
  2. 添加新的iPhone视图 with Controller ,替换其中的视图并像对待一样对待它。除了您必须将文件连接到文件所有者中的插座这一事实。因此,当您实例化该控制器时,所有单元格的子视图都可以。
  3. 这不是一种矫枉过正,或者至少Apple推荐它:click and go to the "Loading Custom Table-View Cells From Nib Files" paragraph

    PS:刚刚遇到类似的情况,这就是我做的方式。在MonoTouch中,对于此示例,您不必LoadNib任何内容。只需在表的源代码中的GetCell覆盖中执行此操作:

    using (CellController controller = new CellController())
    {
    
         cell = (CustomCell)controller.View;
    
    }
    

    甚至可以在CellController对象中声明一个额外的插座,以避免从UIView中进行投射。

答案 2 :(得分:1)

检查link。这是一篇非常有趣的文章,用于创建自定义TableViewCell。我认为错误是由于Monotouch提供的xib的异步加载。

你必须像这样提供自己的结构函数:

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

希望这有帮助!