我希望能够在IB中设计我自己的UITableViewCell。 但是当我尝试访问我在IB中定义的标签时,我一直得到一个空引用异常。
这就是我正在做的事情:
在Interface Builder中:
TestCellView
”。oLblText
添加了一个“TestCellView
”插座,并将UILabel连接到它。实施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的解决方案。我在网上看到了几个这样做的例子。我认为这完全矫枉过正。
我做错了什么?
答案 0 :(得分:3)
在装入笔尖之前,您无法引用任何插座。有一种方法可以覆盖,它会告诉您“您的NIB已加载,您现在可以访问这些字段”。在此之前,引用这些对象将始终返回null。
答案 1 :(得分: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);
}
希望这有帮助!