Xcode 自定义iOS Xib视图未显示在情节提要中

Xcode 自定义iOS Xib视图未显示在情节提要中,xcode,xamarin,xamarin.ios,interface-builder,xib,Xcode,Xamarin,Xamarin.ios,Interface Builder,Xib,我们的Xamarin iOS应用程序中有许多表视图,它们具有用于呈现表行单元格的重复情节提要代码。我正在尝试创建一个包含表行单元格元素的自定义iOS视图(xib),以便它可以在应用程序中的所有表视图中重用 我已经学习了不同的教程,并阅读了许多关于设置自定义iOS视图的文章,并且让所有内容都在构建和运行,但是表行单元格现在显示为空的白色行,而不是实际呈现xib的内容。在自定义视图中的代码中,我能够成功访问元素并填充标签、图像等。。。但这没有任何区别,它仍然显示为一个空白的白色行: 以下是一行的屏

我们的Xamarin iOS应用程序中有许多表视图,它们具有用于呈现表行单元格的重复情节提要代码。我正在尝试创建一个包含表行单元格元素的自定义iOS视图(xib),以便它可以在应用程序中的所有表视图中重用

我已经学习了不同的教程,并阅读了许多关于设置自定义iOS视图的文章,并且让所有内容都在构建和运行,但是表行单元格现在显示为空的白色行,而不是实际呈现xib的内容。在自定义视图中的代码中,我能够成功访问元素并填充标签、图像等。。。但这没有任何区别,它仍然显示为一个空白的白色行:

以下是一行的屏幕截图:

以下是xib文件:

在这里,我将文件所有者设置为我的自定义类:

下面是我引用自定义类作为表视图的表行单元格的情节提要:

以下是我从表视图源类实例化表行单元格的方式:

public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath) {
                    var cell = tableView.DequeueReusableCell (SearchResultUITableViewCell.ReuseKey) as PropertySearchResultRow;
                    cell.Bind (/* Passes in some data to populate the row */);
                    return cell;
            }
        }
最后,这里是自定义视图类中的AwakeFromNib方法:

[Export ("awakeFromNib")]
        public override void AwakeFromNib () {
            base.AwakeFromNib ();
            if (Site != null && Site.DesignMode)
                return;

            var nibObjects = NSBundle.MainBundle.LoadNib ("PropertySearchResultRow", this, null);
            var view = (UIView)Runtime.GetNSObject (nibObjects.ValueAt (0));
            view.Frame = Bounds;
            view.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight;
            AddSubview (view);
        }

要使其正确显示自定义视图的内容,我缺少了哪一步?

1。请记住在控制器的构造函数中调用
registernbforcellReuse
来注册要使用的单元格xib:

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();
        // Perform any additional setup after loading the view, typically from a nib.

        UITableView tablView = new UITableView();

        UINib Nib = UINib.FromName("TableViewCell1", NSBundle.MainBundle);
        tablView.RegisterNibForCellReuse(Nib, "reuseID");
    }
2.在
AwakeFromNib
中获得的边界或帧有时不正确,应将代码移动到布局子视图以使用正确的边界:

    public override void LayoutSubviews()
    {
        base.LayoutSubviews();

        var nibObjects = NSBundle.MainBundle.LoadNib("PropertySearchResultRow", this, null);
        var view = (UIView)Runtime.GetNSObject(nibObjects.ValueAt(0));
        view.Frame = Bounds;
        view.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight;
        AddSubview(view);
    }

我能够正确显示我的自定义iOS视图xib。事实证明,我做的一切都是对的,只是缺少将嵌入式视图锚定到其父表视图单元格的约束。

我做了第一次更改,但xib仍然显示为一个空白的白色行。无法进行第二次更改,因为它只会导致NullReferenceException。在调用tableView.DequeueReusableCell时,将正确调用AwakeFromNib,立即执行此代码非常重要,否则所有控件引用都将为null。如果我等到LayoutSubview执行代码,那么在调用cell.Bind填充数据时,所有控件引用都为null,因此NRE.For#2,我更改了代码,使其仍然在AwakeFromNib中添加子视图,但将框架更新为LayoutSubview中的边界,但是它仍然显示为一个空白的白色行。您可以稍后将其标记为正确答案,以便我们可以帮助更多有相同问题的人。