添加单元格后,TableViewController不会填充容器

时间:2016-08-12 13:46:58

标签: ios uitableview xamarin.ios mvvmcross

我正在使用Xamarin iOS,所以这是在C#...

我有一个UITableViewController动态单元格 - 一个用于标题,N个单元格可供用户添加或删除。表格视图下方是一个带有几个按钮的页脚。触摸“添加”按钮后,它将导航到新项目的编辑器。当它从编辑器返回时,表视图突然没有填充其容器,并且可以看到父视图的背景颜色(UITableView的背景是分组UITableView样式的默认ios灰色。父背景是白色的)。

Screenshot Before navigation

Screenshot After navigation

为了让它变得更奇怪,这不会出现在iOS模拟器中 - 仅在实际的iPad上出现。
此外,如果再次调用layoutSubviews()(例如将方向更改为纵向),它将自行解析。我们在整个地方使用相同的容器和一般设计模式,没有任何问题。这是第一个出现问题的View。

以下是看似相关的代码:

在包含UITableView的父视图中:

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

    _propertyView = new BackNotifyingUINavigationController(this); //This navigation controller hosts the table view
    AddChildViewController(_propertyView);
    _propertyView.View.Frame = PropertyContainer.Bounds;
    PropertyContainer.Add(_propertyView.View);
    _propertyView.DidMoveToParentViewController(this);
    _propertyView.View.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight;

    //Some unrelated views...

    //Some MvvmCross binding stuff...
}

在表格视图中:

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

    _tableSource = new TableSource(TableView); //Custom MvxTableViewSource. Seemingly not overriding anything relevant
    _tableSource.UseAnimations = true;
    _tableSource.DeselectAutomatically = true;
    _tableSource.ReloadOnAllItemsSourceSets = true;

    TableView.AlwaysBounceVertical = false;
    TableView.TableHeaderView = new UIView(new CoreGraphics.CGRect(0, 0, TableView.Bounds.Width, 10.0f));
    TableView.Source = _tableSource;
    TableView.SetEditing(true, false); //Always in editing mode

    _doneButton = new UIBarButtonItem(UIBarButtonSystemItem.Done);
    NavigationItem.RightBarButtonItem = _doneButton;

    //Some MvvmCross binding stuff...
}

编辑:只有当键盘打开时,才会在UINavigationController上的推送或弹出中实际发生这种情况。

1 个答案:

答案 0 :(得分:0)

终于找到了一个似乎可以解决问题的解决方法,但感觉就像是一个大黑客。

在拥有UINavigationController的视图控制器中......

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

        if (_propertyView.TopViewController != null)
        {
            _propertyView.TopViewController.View.Frame = _propertyView.View.Frame;
        }
    }

当然,只有在你希望ViewController占用UINavigationController的全帧时才适用。

似乎应该有更好的方法来处理这个...