1

单触 5.2.13

我正在通过 MonoTouch 绑定使用本机 ObjectiveC 库。该库公开了一个视图控制器。一切正常,直到我子类化视图控制器。然后,我得到 NULL 引用异常或部分 UI 未显示。

我已阅读有关 btouch 工具和“-e”选项的问题。但据我所见,该选项不存在:

工具 /Developer/MonoTouch/usr/bin/btouch 使用参数开始执行:/d:DEBUG ApiDefinition.cs /s:StructsAndEnums.cs /tmpdir:obj/Debug/ios/ /sourceonly:obj/Debug/ios//sources。列表

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

// 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] 添加到属性解决了 NULL 引用异常。

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

但现在我面临图像未显示的问题,并且没有明显的例外。

我认为这些问题也源于使用子类版本时某些内容为 NULL 的事实,但本机代码似乎对 NULL 做出反应并优雅地处理它。

这导致三个问题:

  • 为什么使用子类化时行为不同?MonoTouch 正在做些什么来实现这一目标?在我使用派生类的情况下,为什么我会得到一个 NULL 引用?无论哪种情况,我都没有触及 UIPopoverController。
  • 如果没有错误,我如何找出问题所在以及如何解决?
  • 除了 NullAllowed 之外,还有什么需要注意的?
4

2 回答 2

2

这个具体问题原来是两件事:

  • a 的缺失NullAllowed属性UIPopoverController
  • MonoTouch 5.2.13 中的一个错误,与绑定无关,但与 CocoaTouch 相关。具体原因不明。

MonoTouch 5.3.6 一切正常

于 2012-08-29T07:38:18.543 回答
2

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

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

您需要参考本机库的文档头文件示例和产品支持,以了解子类化的工作原理。

MonoTouch 正在做些什么来实现这一目标?

我认为它与 MonoTouch 无关。MonoTouch 可btouch帮助您为 Objective-C 库创建绑定。这与Xamarin 用于进行所有 iOS 绑定的工具相同。

还是不确定?编写一个小的 Objective-C 示例来做同样的事情。将结果与 MonoTouch 版本进行比较。

结果不同?用(C# 和 ObjC)测试用例填写错误报告,我们将检查发生了什么(如前所述,我们有充分的理由确保btouch没有错误 ;-)

在我使用派生类的情况下,为什么我会得到一个 NULL 引用?无论哪种情况,我都没有触及 UIPopoverController。

如果没有错误,我如何找出问题所在以及如何解决?

除了 NullAllowed 之外,还有什么需要注意的?

在这个阶段,您正在运行您绑定的库的本机代码。您需要遵循的特定规则是您可以通过以下方式找到的规则:

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

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

于 2012-08-28T12:56:13.077 回答