在我正在开发的应用程序中,需要自定义UITableView部分页眉和页脚。为此,我想创建一个使用绑定和逻辑的自定义控件。
为此,我创建了一个XIB并添加了一个类似于以下内容的支持类:
public partial class HeaderFooterView : MvxTableViewHeaderFooterView
{
public static readonly NSString Key = new NSString("HeaderFooterView");
public static readonly UINib Nib = UINib.FromName("HeaderFooterView", NSBundle.MainBundle);
public HeaderFooterView(IntPtr handle) : base(handle)
{
}
public override void AwakeFromNib()
{
base.AwakeFromNib();
//var binding = this.CreateBindingSet<HeaderFooterView, TableViewSection>();
//binding.Apply();
}
}
MvxTableViewHeaderFooterView
实际上是一个非常简单的类,将库存UITableViewHeaderFooterView
与IMvxBindable
相结合。没什么好看的。
但是出于某种原因,即使我在TableViewSource构造函数中正确注册它:
tableView.RegisterNibForHeaderFooterViewReuse(HeaderFooterView.Nib, HeaderFooterView.Key);
并且只做正确的方式返回Header本身:
public override UIView GetViewForHeader(UITableView tableView, nint section)
{
return tableView.DequeueReusableHeaderFooterView(HeaderFooterView.Key);
}
该应用程序因以下错误而死亡:
2017-07-12 16:56:40.517 MyAppiOS[3833:58706] *** Assertion failure in -[UITableView _dequeueReusableViewOfType:withIdentifier:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3600.7.47/UITableView.m:6696
2017-07-12 16:56:40.528 MyAppiOS[3833:58706] WARNING: GoogleAnalytics 3.17 void GAIUncaughtExceptionHandler(NSException *) (GAIUncaughtExceptionHandler.m:48): Uncaught exception: invalid nib registered for identifier (HeaderFooterView) - nib must contain exactly one top level object which must be a UITableViewHeaderFooterView instance
我的NIB实际上包含一个根对象,即根视图本身,它设置为HeaderFooterView
类(它派生自MvxTableViewHeaderFooterView
,后者又来自UITableViewHeaderFooterView
)。但它声称没有UITableViewHeaderFooterView实例。
为什么它不能正常运作?
答案 0 :(得分:0)
这是因为如果没有HeaderFooterViews可以重用,return tableView.DequeueReusableHeaderFooterView(HeaderFooterView.Key);
可以返回null。在这种情况下,你必须创建自己的:
var view = tableView.DequeueReusableHeaderFooterView(HeaderFooterView.Key);
if (view == null){
//instantiate the nib here and set view
}
return view;
答案 1 :(得分:0)
我建议按如下方式构建支持类:
public partial class HeaderFooterView : MvxTableViewHeaderFooterView
{
public static readonly NSString Key = new NSString("HeaderFooterView");
public static readonly UINib Nib = UINib.FromName("HeaderFooterView", NSBundle.MainBundle);
static HeaderFooterView()
{
//Adding this alone should allow your tableview to properly instantiate the view.
Nib = UINib.FromName("HeaderFooterView", NSBundle.MainBundle);
}
public static HeaderFooterView Create()
{
// However you can add this static method and create and return the view yourself.
var arr = NSBundle.MainBundle.LoadNib(nameof(HeaderFooterView ), null, null);
var v = Runtime.GetNSObject<HeaderFooterView >(arr.ValueAt(0));
return v;
}
public HeaderFooterView(IntPtr handle) : base(handle)
{
// Note: this .ctor should not contain any initialization logic.
}
public override void AwakeFromNib()
{
base.AwakeFromNib();
}
}
添加静态构造函数本身就足以让您的表视图正确实例化Nib。但是,如果您仍然遇到类似问题,可以使用静态方法&#39;创建&#39;自己实例化nib:
public override UIView GetViewForHeader(UITableView tableView, nint section)
{
HeaderFooterView theView = HeaderFooterView.Create()
return theView;
}
尝试这些建议,其中一个或两个都适合你。
答案 2 :(得分:0)
好的,找到了问题。
虽然我的初始XIB是正确的,但由于某种原因,root对象的类型被删除了,Interface Builder拒绝接受我的。
然而,使用VS2017 for Mac,我能够设置正确的根视图类,现在一切正常。