Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从xib文件加载视图时获取System.InvalidCastException_C#_Macos_Xamarin_Xib_Nsview - Fatal编程技术网

C# 从xib文件加载视图时获取System.InvalidCastException

C# 从xib文件加载视图时获取System.InvalidCastException,c#,macos,xamarin,xib,nsview,C#,Macos,Xamarin,Xib,Nsview,我有一个xib文件-LoaderView.xib和相关的类LoaderView.cs,其中包含一个用于显示加载文本的视图。当我尝试将其作为- public override void ViewDidAppear() { base.ViewDidAppear(); NSBundle.MainBundle.LoadNibNamed("LoaderView", this, out NSArray arr); var view = Runtime.GetNSObject<Loa

我有一个xib文件-LoaderView.xib和相关的类LoaderView.cs,其中包含一个用于显示加载文本的视图。当我尝试将其作为-

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

   NSBundle.MainBundle.LoadNibNamed("LoaderView", this, out NSArray arr);
   var view = Runtime.GetNSObject<LoaderView>(arr.ValueAt(0));
   view.Frame = View.Frame;
   View.AddSubview(view);
}
公共覆盖无效视图显示()
{
base.viewDidDisplay();
NSBundle.MainBundle.LoadNibNamed(“LoaderView”,this,out-NSArray-arr);
var view=Runtime.GetNSObject(arr.ValueAt(0));
view.Frame=view.Frame;
视图。添加子视图(视图);
}
我得到了这行中的System.InvalidCastException-

var view = Runtime.GetNSObject<LoaderView>(arr.ValueAt(0));
var view=Runtime.GetNSObject(arr.ValueAt(0));
奇怪的是,我并不是每次都有例外。当它工作时,我看到加载文本与默认视图重叠-与ViewController关联


有人能指出什么是显示加载、错误和空状态的最佳方式吗。我应该为它们设置单独的视图控制器吗?或者我可以从主视图控制器加载/卸载单独的xib文件吗?如何从xib文件加载视图?

问题在于arr

在上面的图像中,可以看到方法
LoadNibNamed
每次都没有以相同的顺序返回
arr
中的顶级对象。这就是为什么代码-

var view = Runtime.GetNSObject<LoaderView>(arr.ValueAt(0));

至于重叠问题,我发现子视图是透明的,除非它的背景被明确设置。

这是Xamarin的文档问题。他们的文档说使用第0个索引,但实际情况是数组顺序不是确定性的

Anagh给出的答案是充分的,并且在技术上是最佳的,但是您可以通过使用Linq使其更加简洁,并且它也非常适合扩展方法:

public static class NibLoadingExtension
{
    public static T LoadViewFromNib<T>(this T @null) where T : NSView
    {
        NSBundle.MainBundle.LoadNibNamed(typeof(T).Name, null, out var array);
        return NSArray.FromArray<NSObject>(array).OfType<T>().FirstOrDefault();
    }
}
还有一个支持向每个视图类添加静态Create()方法或其他方法的参数,因为这样您就可以调用私有初始值设定项,如下所示:

public static LoaderView Create(ExampleDependency dependency)
{
    var model = dependency ?? throw new ArgumentNullException(nameof(dependency));
    NSBundle.MainBundle.LoadNibNamed(nameof(LoaderView), null, out var array);
    var view = NSArray.FromArray<NSObject>(array).OfType<LoaderView>().FirstOrDefault();
    view.Initialize(model);
    return view;
}

private void Initialize(ExampleDependency dependency)
{
    _privateField1 = dependency.Value1;
    _privateField2 = dependency.Value2;
    _privateField3 = dependency.Value3;
}
公共静态LoaderView创建(例如依赖项)
{
var model=dependency??抛出新ArgumentNullException(nameof(dependency));
NSBundle.MainBundle.LoadNibNamed(nameof(LoaderView),null,out var数组);
var view=NSArray.FromArray(array).OfType().FirstOrDefault();
视图。初始化(模型);
返回视图;
}
私有void初始化(例如依赖关系)
{
_privateField1=dependency.Value1;
_privateField2=dependency.Value2;
_privateField3=dependency.Value3;
}
var loaderView = default(LoaderView).LoadViewFromNib();
public static LoaderView Create(ExampleDependency dependency)
{
    var model = dependency ?? throw new ArgumentNullException(nameof(dependency));
    NSBundle.MainBundle.LoadNibNamed(nameof(LoaderView), null, out var array);
    var view = NSArray.FromArray<NSObject>(array).OfType<LoaderView>().FirstOrDefault();
    view.Initialize(model);
    return view;
}

private void Initialize(ExampleDependency dependency)
{
    _privateField1 = dependency.Value1;
    _privateField2 = dependency.Value2;
    _privateField3 = dependency.Value3;
}