【问题标题】:Programmatically Created NSTableView throwing Failed to marshal the Objective-C object (Xamarin)以编程方式创建的 NSTableView 抛出无法编组 Objective-C 对象(Xamarin)
【发布时间】:2016-04-24 06:02:09
【问题描述】:

在我的 Xamarin Mac 项目中,我以编程方式设置了 NSTableView。我有一个用于列标题单元格的自定义 NSTableHeaderCell。由于某些原因,在某些机器上,它会抛出错误

Failed to marshal the Objective-C object 0x121f77e90 (type: XXXTableHeaderCell). Could not find an existing managed instance for this object, nor was it possible to create a new managed instance (because the type 'XXXTableHeaderCell' does not have a constructor that takes one IntPtr argument). 

我知道如果您从 nib/xib 加载,这可能会被抛出,但我是在代码中构建的。我也知道,如果您的托管对象被 GC 处理,可能会发生这种情况,但是表视图应该保留标题单元格和列对象。

放入一个采用 IntPtr 的空构造函数似乎可以解决问题,但我担心它会创建一个新对象,而它应该使用已经存在的东西(或者至少应该仍然存在)。

我是否错过了如何保存这些内容?

【问题讨论】:

  • 在没有看到任何代码的情况下很难提供帮助,但是是的,几乎总是该错误是由于没有托管对应物的 ObjC obj 导致的(得到了 GC 处理)。我会确保你的 XXXTableHeaderCell 在某处有一个类级别的引用。
  • 为了排除这种情况,我确实为我的 NSTableView 子类中的每个列和标题单元格添加了类级对象。我仍在试图找出谁在调用 IntPtr 构造函数。它被调用了两次,但我有四列。我希望它被称为 4x 或没有……但是两个?不幸的是,我不能发布代码本身。我会尝试制作一个样本,但这会花费我无法节省的时间,而且这只发生在某些机器上。

标签: c# xamarin mono monomac xamarin.mac


【解决方案1】:

错误的最后一部分可能包含密钥:

'XXXTableHeaderCell' 没有采用一个 IntPtr 参数的构造函数

您是否公开了一个采用 IntPtr 的构造函数(使用该指针调用 base)?这用于托管代码和本机代码之间的编组。

【讨论】:

  • 我确实添加了一个。但是所有的列和标题都是在我的代码中手动分配的。直到后来才发生崩溃。我不知道还有什么东西会试图编组他们。
猜你喜欢
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多