0

注意:也许这个问题也可以由纯 Objective-C 专家来回答?我主要在 MonoTouch 中工作,但我认为这个问题可能不是MonoTouch 特有的。

通常,当 XCode 中的助理编辑器不显示我的.h文件时,我只需关闭所有内容,删除我的 obj 目录,然后重建所有. 我等待该Indexing过程完成。但是这次我真的无法让.h文件显示出来,因此我无法在我的FooViewController.

到目前为止,我已经将它追踪到IBClassDescriber我的一个空元素FooViewController.xib

<object class="IBClassDescriber" key="IBDocument.Classes"/>

这应该看起来更像:

<object class="IBClassDescriber" key="IBDocument.Classes">
        <array class="NSMutableArray" key="referencedPartialClassDescriptions">
                <object class="IBPartialClassDescription">
                        <string key="className">FooViewController</string>
                        <string key="superclassName">UIViewController</string>
                        <dictionary class="NSMutableDictionary" key="outlets">
                            ...
                        </dictionary>
                        <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
                            ...
                        </dictionary>
                        <object class="IBClassDescriptionSource" key="sourceIdentifier">
                                <string key="majorKey">IBProjectSource</string>
                                <string key="minorKey">./Classes/FooViewController.h</string>
                        </object>
                </object>
        </array>
</object>

其中包含指向该.h文件minorKey的链接IBClassDescriptionSource

我试过清理我的项目,关闭我的所有应用程序并删除objbin目录。我试过重命名文件(连同上面的文件)。以及其他各种零星的诅咒和删除/还原/大声敲打东西。无济于事。

IBClassDescriber有谁知道元素清空后如何恢复?

我将回顾一下文件历史记录,看看它什么时候消失了。也许这会给我一个线索。

谢谢!厘米

4

1 回答 1

0

因此,当我重命名ViewController文件并且未能更新对旧名称的所有引用时,就会出现这种情况(就像其他人所做的那样)。视图控制器的名称有几个地方需要更改,但实际上只有 2 个关键地方需要匹配以使 XCode 和 MonoDevelop 同步。对于此示例,假设我有一个名为的视图控制器并将FooViewController其重命名为BarViewController.

首先,每次启动 XCode (XC) 时,MonoDevelop (MD) 都会创建一个名为obj/XCode/#where#从 0 开始的临时目录,每次重新启动 XC 时都会递增 1。每次重新启动 MD 时,该数字都会重置为 0。每次关闭 XC 并返回 MD 时,目录都会被删除。

注意:如果您从 Finder 或终端等浏览目录,该目录不会被删除。

MD在 XC 期望看到的目录中创建所需的文件.h和文件。这些文件的名称.m基于. 就我而言,我已将文件正确更新为:RegisterYourViewController.designer.cs.designer

[Register ("BarViewController")]

现在,当我打开时,.xib我得到了可怕的No Assistant Results错误。

此时,我的.xib文件在 MD 的源代码编辑器中打开时,显示了一个完整的IBClassDescriber部分(尽管./Classes/FooViewController.h由于我还没有更新它,所以引用不正确)。

我接下来要做的是从 XC中保存。.xib由于 XC 找不到./Classes/FooViewController.h(MD 现在正在生成BarViewController.h),它从 中删除了该IBClassDescriber部分.xib,给了我一个空实体

<object class="IBClassDescriber" key="IBDocument.Classes"/>

我未能.xib正确更新,现在我丢失了整个部分(其中有许多我不想或不知道如何重新创建的引用)。

解决此问题的关键是注意到 中的-1.CustomClassname属性.xib设置不正确。更新它以匹配Register设置

<dictionary class="NSMutableDictionary" key="flattenedProperties">
    <string key="-1.CustomClassName">BarViewController</string>
    ...
</dictionary>

并重新保存文件导致 XC使用对文件IBClassDescriber的正确引用重新创建整个部分.h

<object class="IBClassDescriber" key="IBDocument.Classes">
        <array class="NSMutableArray" key="referencedPartialClassDescriptions">
                <object class="IBPartialClassDescription">
                        <string key="className">BarViewController</string>
                        <string key="superclassName">UIViewController</string>
                        <object class="NSMutableDictionary" key="outlets">
                            ...
                        </object>
                        <object class="NSMutableDictionary" key="toOneOutletInfosByName">
                            ...
                        </object>
                        <object class="IBClassDescriptionSource" key="sourceIdentifier">
                                <string key="majorKey">IBProjectSource</string>
                                <string key="minorKey">./Classes/BarViewController.h</string>
                        </object>
                </object>
        </array>
</object>

总而言之,当您重命名文件时,要更改的地方是:

  1. 重构/重命名您的主 ViewController 类(例如,改名FooViewController.csBarViewControllercs. 使用重构(右键单击类文件 -> 重构 -> 重命名)将为您更新很多东西,包括.designer文件和整个代码中对该类的任何引用
  2. public GrepViewController () : base ("BarViewController", null)在运行时加载类所需的 ViewController 构造函数中更改传递给超类的字符串值
  3. 打开您的.designer文件并更改Register调用,以便保持 XC 和 MD 之间的链接:[Register ("BarViewController")] partial class BarViewController
  4. 重命名.xibBarViewController.xib
  5. 使用源代码编辑器在 MD 中打开BarViewController.xib(右键单击 -> 打开方式 -> 源代码编辑器)并更改-1.CustomClassName密钥:<string key="-1.CustomClassName">BarViewController</string>
  6. .xib从 MD保存
  7. BarViewController.xib在 XC 中打开。(如果你已经在 MD 中打开它,你需要右键单击 -> 打开方式 -> XCode)。等待索引完成,然后打开 Assistant Editor。请注意,BarViewController.h它(正确地)打开了。
  8. .xib从 XC保存。
  9. 打开.xibMD 并注意该IBClassDescriber部分已完全指定,即使它一开始是空的。

装运它!

希望这对某人有所帮助,解开 XC 和 MD 之间联系的一些谜团,或者至少提醒我下次遇到这个问题时该怎么做。

干杯,厘米

于 2012-10-26T01:37:30.840 回答