我使用Xamarin iOS设计器为我的TableView设计自定义TableViewCell类。 但是除了单元本身之外,所有单元子视图属性(出口)都返回null。
我的自定义单元格类:
partial class VehiclesTableCell : UITableViewCell
{
public VehiclesTableCell(IntPtr handle) : base(handle) { }
public void UpdateCell(string licensePlate) {
licensePlateLabel.Text = licensePlate; //hit the null reference exception for licensePlateLabel
}
}
生成的部分类:
[Register ("VehiclesTableCell")]
partial class VehiclesTableCell
{
[Outlet]
[GeneratedCode ("iOS Designer", "1.0")]
UILabel licensePlateLabel { get; set; }
void ReleaseDesignerOutlets ()
{
if (licensePlateLabel != null) {
licensePlateLabel.Dispose ();
licensePlateLabel = null;
}
}
}
我的Table Source类的GetCell:
public class VehiclesTableSource : UITableViewSource
{
public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) {
// Dequeueing the reuse cell
var cell = (VehiclesTableCell)tableView.DequeueReusableCell(new NSString(typeof(VehiclesTableCell).Name));
// Set cell properties
cell.UpdateCell(LicensePlate);
// Return the cell with populated data
return cell;
}
}
正如我们所看到的,生成的代码有一个licensePlate的出口,为什么它的属性为null? 故事板是不是应该自动实例化其所有子视图? 至少它发生在所有其他情况中。
答案 0 :(得分:7)
我的自定义TableViewCell
遇到了同样的问题。我发现问题出在TableView.RegisterClassForCellReuse (typeof(MyCell), MyCellId)
。我必须将其更改为TableView.RegisterNibForCellReuse(UINib.FromName("MyCell", NSBundle.MainBundle), MyCellId)
才能加载我的.xib。
答案 1 :(得分:2)
我自己遇到过这个问题。这就是我解决它的方法:
在自定义单元格的构造函数中实例化子视图的组件。在你的情况下,像:
public VehiclesTableCell(IntPtr handle) : base(handle) {
licensePlateLabel = new UILabel();
}
覆盖方法LayoutSubviews:
public override void LayoutSubviews () {
base.LayoutSubviews ();
licensePlateLabel.Frame = new RectangleF(63, 5, 33, 33); // Your layout here
}
this guide上的信息让我走得这么远,但理想情况下,有一种方法可以实现这一目标,而无需手动实例化和布局子视图组件,因为它们已在IOS设计器中定义。希望有人可以用更好的方式来实现这个目标...
编辑:我遇到this answer,这解释了为什么我无法绑定我在设计器中创建的自定义表格单元格。 TLDR:确保Identity -> Class
和Table View Cell -> Identifier
都设置为检查器窗口中的自定义表视图单元类名称。
答案 2 :(得分:1)
我遇到了同样的问题,据我所知,如果你使用的是故事板,你可以在iOS设计器的表格单元属性中输入你的自定义类名,它应该有效。调用RegisterClassForCellReuse()
是导致null
子视图问题的原因。一旦我删除了该方法调用它似乎工作