1

我正在使用 Xamarin.iOS 构建 iOS 应用程序。我正在使用情节提要,并UITableViewController使用自定义单元格创建了一个带有分组表的表格。该单元格包含我要为其分配值的标签。

覆盖数据源中的 getcell 方法来设置标签的 text 属性会引发空异常,我找不到原因?我检查了插座,它就在那里。关于如何找到错误的任何提示?

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? 
    }
}
4

1 回答 1

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")]在XIB 中使用。.cs您还需要MyTableCell在 XIB 文件中设置设计单元的类型。

但是,使用 Xamarin 模板(如果您创建一个新的 iOS 文件,您可以选择它们),您会发现一个自定义单元格模板。

于 2013-05-22T18:14:11.117 回答