MonoTouch 5错误:迁移到Xcode 4.2和MonoDevelop 2.8后“无法找到选择器setXxxxxx”

时间:2011-10-20 17:18:16

标签: xamarin.ios selector monodevelop xcode4.2 outlet

我有一个在Xcode 3.2.6 / MonoTouch 4.2.x / MonoDevelop 2.6中开发的iPad项目,当我安装Monotouch 5,MonoDevelop 2.8.1和Xcode 4.2时,项目编译并运行正常。但是当我开始在Xcode 4.2(添加插座)中更改XIB文件时,我开始出现一些问题:

1)应用程序崩溃和调试模式下的MonoDevelop表示未加载视图,因为未设置视图插座。我发现在Xcode 4.2中,不需要在.h文件中创建一个名为“view”的插座,只需要将File Owner视图连接到设计器中的视图控件。正确的吗?

2)主要问题尚未解决,我得到异常“找不到选择器setXxxxx”,其中“xxxxx”是UI控件的插座名称。它开始发生在继承自基本视图控制器的ViewControllers中,但是一旦我开始更改其他普通的viewControllers,我就会得到相同类型的错误。什么是错误的暗示?

3)我有一个控制器,动态加载一些视图,并且工作正常。但是当我在其中一个子视图出口(如UILabel的文本)上设置属性时,该值被设置(在调试器上)但UI中没有变化。例如,这些行动很好。可能有什么不对。

4)为了在Xcode 4.2下正确地与MonoDevelop 2.8集成,需要在XIB中进行任何特殊设置吗?

非常感谢帮助,我想回到上一组工具和monotouch,但我想一旦项目升级,就没有办法回去而不会失去现在完成的所有开发。

谢谢,佩德罗

编辑:除了由MonoTouch 5生成的新的干净归因[Outlet]代码(替换之前生成的大量代码)之外,显着不同的是,在生成的分部类之前是公共的现在是私人的,这可能是我的问题的根源。有没有办法生成公共部分类或受保护?

EDIT 2 :如果我手动将public关键字添加到part.c中的部分类和MonoTouch生成的成员,则会在幕后生成选择器并且所有工作都可以。这表明随着从公共部分类到私有部分类的变化,MonoTouch 5中的绑定生成发生了变化,是设计还是错误?我觉得很奇怪,现在它不可能创建一个带有出口的视图控制器,将它子类化,子视图控制器无法访问父类出口。

1 个答案:

答案 0 :(得分:4)

1)基础UIViewController类确实有一个视图出口,它是一个Objective-C属性。将Interface Builder 3与MonoTouch一起使用时,IB通常不允许连接到基本视图插座,因此许多用户在其自定义子类中创建了自己的用户。 MonoDevelop 2.6及更早版本将这些自定义插件创建为ivars(Objective-C字段),显然UIKit运行时会将对象连接到插座的两个版本 - 自定义ivar和基本属性。 MonoDevelop 2.8将自定义出口生成为属性,这意味着冗余视图出口会遮挡基本视图出口,因此永远不会设置基本视图出口,并且UIKit会感到不快。您可以通过删除冗余的自定义视图插座来解决此问题 - MD 2.8.2将do this automatically

2)似乎是MonoTouch导出自定义出口的方式的一个错误,该出口阻止连接到基类中定义的自定义出口。 bug report上提到了一种可能的解决方法。

3)当您的应用在调试器中暂停时,UI呈现不会更新,它将在下一次主循环迭代时更新。

4)不。

5)类可访问性应由用户类部分控制,而不是设计者类部分,因此您可以自由地更改它。