【问题标题】:Custom iOS Xib View not displaying in Storyboard自定义 iOS Xib 视图未显示在情节提要中
【发布时间】:2020-05-07 23:57:08
【问题描述】:

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

我遵循了不同的教程并阅读了许多 SO 帖子来设置自定义 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);
        }

我缺少什么步骤才能正确显示自定义视图的内容?

【问题讨论】:

    标签: xcode xamarin xamarin.ios interface-builder xib


    【解决方案1】:

    1.记得通过在控制器的构造函数中调用RegisterNibForCellReuse来注册要使用的单元格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 中获得的边界或框架有时不正确,您应该将代码移动到 LayoutSubviews 以使用正确的边界:

        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);
        }
    

    【讨论】:

    • 我进行了第一次更改,但 xib 仍显示为空白行。无法进行第二次更改,因为它只会导致 NullReferenceException。 AwakeFromNib 在调用 tableView.DequeueReusableCell 时被正确调用,并且立即执行此代码至关重要,否则所有控件引用都将为空。如果我等到 LayoutSubviews 执行代码,那么当调用 cell.Bind 填充数据时,所有控件引用都为空,因此 NRE。
    • 对于#2,我更改了代码以仍然在 AwakeFromNib 中添加子视图,但将框架更新为 LayoutSubviews 中的边界,但它仍然显示为空白行。
    【解决方案2】:

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

    【讨论】:

    • 您可以稍后将其标记为正确答案,以便我们可以帮助更多有相同问题的人。
    猜你喜欢
    • 2015-04-14
    • 2015-03-04
    • 2015-01-02
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 2019-09-29
    • 1970-01-01
    相关资源
    最近更新 更多