Custom iOS Xib View не отображается в раскадровке - PullRequest
1 голос
/ 22 января 2020

В нашем приложении Xamarin iOS есть несколько табличных представлений, которые дублировали код раскадровки для рендеринга ячеек строк таблицы. Я пытаюсь создать собственное представление iOS (xib), которое содержит элементы ячеек строки таблицы, чтобы его можно было повторно использовать во всех представлениях таблицы в нашем приложении.

Я следовал различным учебным пособиям, а также прочитал много SO-сообщений, чтобы настроить собственное представление iOS, и у меня все построено и работает, однако ячейки строк таблицы теперь отображаются в виде пустых белых строк вместо фактического рендеринга содержание сиб. В коде в пользовательском представлении я могу успешно получить доступ к элементам и заполнить метки, изображения и т. Д. c ... но это не имеет никакого значения, оно все равно отображается в виде пустой белой строки:

enter image description here

Вот скриншот того, как должна выглядеть строка:

enter image description here

Вот файл xib:

enter image description here

Здесь я устанавливаю владельца файла в свой пользовательский класс:

enter image description here

Вот раскадровка, где я ссылаюсь на свой пользовательский класс в качестве ячейки строки таблицы моего представления таблицы:

enter image description here

Вот как я создаю экземпляр ячейки строки таблицы из моего исходного класса представления таблицы:

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

Какой шаг мне не хватает, чтобы получить правильное отображение содержимого пользовательского представления?

Ответы [ 2 ]

1 голос
/ 22 января 2020

1. Запомните, чтобы зарегистрировать xib ячейки для использования, вызвав RegisterNibForCellReuse в конструкторе контроллера:

    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);
    }
0 голосов
/ 22 января 2020

Мне удалось настроить мой пользовательский iOS вид xib для правильного отображения. Оказывается, я все делал правильно, за исключением того, что мне не хватало ограничений, привязывающих встроенное представление к его родительской ячейке табличного представления.

...