Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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# 在MonoTouch中绑定本机库:可行,但为什么子类化时会出现奇怪的结果?缺少NullAllowed属性?_C#_Objective C_Ios_Xamarin.ios_Subclass - Fatal编程技术网

C# 在MonoTouch中绑定本机库:可行,但为什么子类化时会出现奇怪的结果?缺少NullAllowed属性?

C# 在MonoTouch中绑定本机库:可行,但为什么子类化时会出现奇怪的结果?缺少NullAllowed属性?,c#,objective-c,ios,xamarin.ios,subclass,C#,Objective C,Ios,Xamarin.ios,Subclass,MonoTouch 5.2.13 我通过MonoTouch绑定使用原生Objective库。该库公开一个视图控制器。在我将视图控制器子类化之前,一切正常。然后,我得到空引用异常或部分UI未显示 我已经读过关于btouch工具和“-e”选项的问题。但据我所见,这一选择并不存在: 工具/Developer/MonoTouch/usr/bin/b触摸执行开始于 参数:/d:DEBUG ApiDefinition.cs/s:StructsAndEnums.cs /tmpdir:obj/Debug/ios

MonoTouch 5.2.13

我通过MonoTouch绑定使用原生Objective库。该库公开一个视图控制器。在我将视图控制器子类化之前,一切正常。然后,我得到空引用异常或部分UI未显示

我已经读过关于btouch工具和“-e”选项的问题。但据我所见,这一选择并不存在:

工具/Developer/MonoTouch/usr/bin/b触摸执行开始于 参数:/d:DEBUG ApiDefinition.cs/s:StructsAndEnums.cs /tmpdir:obj/Debug/ios//sourceonly:obj/Debug/ios//sources.list

子类(在本例中)没有添加任何功能,但使用它就足以破坏绑定:

// Works.
var contr = new NativeController();

// Fails with various errors. Throws a NULL reference exception about some UIPopoverController being NULL, for instance.
public class SubclassedController : NativeController
{
  public SubclassedController() : base()
  {
  }
}

var contr = new SubclassedController();
我发现将[NullAllowed]添加到属性解决了空引用异常

本机控制器公开一个属性
(非原子、强)UIPopoverController*popoverController
。这被绑定为
UIPopoverController-PopoveController{get;set;}
——在这里添加
NullAllowed
解决了这个问题

但现在我面临的问题是图像无法显示,也没有明显的例外

我假设这些问题也源于这样一个事实,即当使用子类版本时,有些东西是空的,但是本机代码似乎会对空作出反应并优雅地处理它

这导致了三个问题:

  • 为什么使用子类化时行为不同?MonoTouch是如何做到这一点的?为什么在使用派生类的情况下会得到NULL ref?无论哪种情况,我都没有碰过超控器
  • 如果没有错误,我如何找出错误以及如何修复它
  • 除此之外,还有什么需要注意的呢
为什么使用子类化时行为不同

可能有几个原因,包括实例根据其类名以不同的方式初始化自身。在C#(非常罕见,使用的是继承)或Objective-C(委托通常用于自定义行为)中执行并不困难

您需要参考本机库的、和产品支持,以了解子类化是如何工作的

MonoTouch是如何做到这一点的

我不认为这与单触有关。MonoTouch提供了
b触摸
,帮助您为Objective-C库创建绑定。这是Xamarin用来制作所有iOS绑定的相同的工具

还不确定吗?写一个小的Objective-C示例,它也能做到这一点。将结果与MonoTouch版本进行比较

不同的结果?用(C#和ObjC)两个测试用例填充一个测试用例,我们将检查发生了什么(如前所述,我们有充分的理由确保
b触摸
没有bug;-)

为什么在使用派生类的情况下会得到NULL ref?无论哪种情况,我都没有碰过超控器

如果没有错误,我如何找出错误以及如何修复它

除此之外,还有什么需要注意的呢

在此阶段,您将运行绑定库的本机代码。您需要遵循的具体规则如下:

  • 阅读图书馆文献
  • 读取库源(如果可用)、标题和示例
  • 对于
    [NullAllowed]
    您可以测试(例如单元测试)是否允许
    null
    (例如,它是否会崩溃)
此外,移植现有示例既是一个很好的学习练习(库API),也是测试绑定错误(例如选择器中的输入错误、错误参数…)的一种快速方法

为什么使用子类化时行为不同

可能有几个原因,包括实例根据其类名以不同的方式初始化自身。在C#(非常罕见,使用的是继承)或Objective-C(委托通常用于自定义行为)中执行并不困难

您需要参考本机库的、和产品支持,以了解子类化是如何工作的

MonoTouch是如何做到这一点的

我不认为这与单触有关。MonoTouch提供了
b触摸
,帮助您为Objective-C库创建绑定。这是Xamarin用来制作所有iOS绑定的相同的工具

还不确定吗?写一个小的Objective-C示例,它也能做到这一点。将结果与MonoTouch版本进行比较

不同的结果?用(C#和ObjC)两个测试用例填充一个测试用例,我们将检查发生了什么(如前所述,我们有充分的理由确保
b触摸
没有bug;-)

为什么在使用派生类的情况下会得到NULL ref?无论哪种情况,我都没有碰过超控器

如果没有错误,我如何找出错误以及如何修复它

除此之外,还有什么需要注意的呢

在此阶段,您将运行绑定库的本机代码。您需要遵循的具体规则如下:

  • 阅读图书馆文献
  • 读取库源(如果可用)、标题和示例
  • 对于
    [NullAllowed]
    您可以测试(例如单元测试)是否允许
    null
    (例如,它是否会崩溃)

此外,移植现有示例既是一个很好的学习练习(库API),也是一种快速测试绑定错误(例如选择器中的输入错误、错误的参数…)的方法。

这个具体问题有两个方面:

  • UIPopoverController的
    NullAllowed
    属性缺失
  • MonoTouch 5.2.13中的一个bug,与绑定无关,但与CoCoTouch有关。特定的