填充 UITableViewController 时,自定义单元格中的标签为空

Posted

技术标签:

【中文标题】填充 UITableViewController 时,自定义单元格中的标签为空【英文标题】:Label in custom cell is null when populating UITableViewController 【发布时间】:2013-05-22 17:17:19 【问题描述】:

我正在使用 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? 
    

【问题讨论】:

你能发布异常吗? 只是通常的“对象引用未设置为...的实例”,因为 NameLabel 对象为空。问题是为什么它是空的,因为视图即将显示。 【参考方案1】:

根据您的问题,我认为您没有以正确的方式加载 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;

如果您尚未注册,您需要在.cs[Register("MyTableCell")] 才能在XIB 中使用。您还需要在您的XIB文件中将设计单元格的类型设置为MyTableCell

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

【讨论】:

尝试了您的建议,但在执行 LoadNib("MyTableCell") 时出现异常:MonoTouch.Foundation.MonoTouchException: Objective-C 异常抛出。名称:NSInternalInconsistencyException 原因:无法在包中加载 NIB:'NSBundle /.../MyIosApp.app>(已加载)',名称为 'MyTableCell'...” 由于表格单元格是使用情节提要创建的,因此该类是分为两个部分类,其中 MyTableCell.designer.cs 有 register 语句。我猜这足够了吗?

以上是关于填充 UITableViewController 时,自定义单元格中的标签为空的主要内容,如果未能解决你的问题,请参考以下文章

UITabBarController中的UITableViewController = iOS 11上不需要的填充

填充 UITableViewController 时,自定义单元格中的标签为空

使用 Firebase 数据 Swift、Xcode 7 填充 UITableViewController

我可以使用一个自定义创建的 UIViewController 来填充父 UITableViewController 的单元格文本值吗?

从 UITableViewController 添加标记到 UIViewController

UITableViewController 没有将视图推送到堆栈上