我正在使用Xamarin.iOS构建iOS应用。我正在使用故事板并使用自定义单元格创建了一个带有分组表格的UITableViewController
。单元格包含我要为其分配值的标签。
覆盖数据源中的getcell方法以设置标签的text属性会抛出一个null异常,我找不到原因?我检查了插座,它就在那里。有关如何查找错误的任何提示?
public partial class NameListScreen : UITableViewController
{
MyTableSource _source = null;
public override void ViewWillAppear (bool animated)
{
base.ViewWillAppear (animated);
LoadNameList();
}
void LoadNameList ()
{
var service = new MyService();
var names = service.GetAllNames();
_source = new MyTableSource(names);
this.TableView.Source = _source;
}
}
public class MyTableSource : UITableViewSource {
protected List<string> _names;
protected string _cellIdentifier = "MyCell";
public MyTableSource (List<string> items)
{
_names = items;
}
public override int RowsInSection (UITableView tableview, int section)
{
return _names.Count;
}
public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
{
// Request a recycled cell to save memory
var cell = (MyTableCell) tableView.DequeueReusableCell(_cellIdentifier);
// If there are no cells to reuse, create a new one
if (cell == null)
cell = new MyTableCell();
cell.UpdateCell(indexPath, _names[indexPath.Item]);
return cell;
}
}
public partial class MyTableCell : UITableViewCell
{
public MyTableCell () : base ()
{ }
public MyTableCell (IntPtr handle) : base (handle)
{ }
public void UpdateCell(NSIndexPath indexPath, string name)
{
this._indexPath = indexPath;
this._id = track.TrackId;
this.NameLabel.Text = name; //This row throws exception as NameLabel is null, why?
}
}
答案 0 :(得分:0)
根据您的问题,我认为您没有以正确的方式加载xib。在你自定义单元格内部,只需输入如下的静态方法。
// Inside MyTableCell
public static MyTableCell Create()
{
NSArray topLevelObjects = NSBundle.MainBundle.LoadNib("MyTableCell", null, null);
MyTableCell cell = Runtime.GetNSObject(topLevelObjects.ValueAt(0)) as MyTableCell;
return cell;
}
此模式现在用于新的Xamarin单元格创建模板。唯一的区别是使用了UINib
类(我无法验证它,因为我没有Xamarin Studio)。
然后,在GetCell
方法中,您应该执行以下操作
public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
{
// Request a recycled cell to save memory
var cell = (MyTableCell) tableView.DequeueReusableCell(_cellIdentifier);
// If there are no cells to reuse, create a new one
if (cell == null)
cell = MyTableCell.Create();
cell.UpdateCell(indexPath, _names[indexPath.Item]);
return cell;
}
如果您尚未注册,则需要[Register("MyTableCell")]
中的.cs
才能在XIB中使用。您还需要在XIB文件中将设计单元格的类型设置为MyTableCell
。
但是,玩一下Xamarin模板(你可以选择它们,如果你创建一个新的iOS文件),你会发现一个自定义的单元格模板。