由于.xib中的空IBClassDescriber元素,XCode中的.h文件关联丢失

时间:2012-10-25 22:35:16

标签: ios xcode xamarin.ios xib

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

通常,当XCode中的助理编辑器不显示我的.h文件时,我只是close everything, delete my obj directory, and rebuild all。我等待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 minorKeyIBClassDescriptionSource文件的链接。

我尝试清理项目,关闭所有应用并删除objbin目录。我已经尝试重命名文件(以及上面的内容)。和其他各种零星的咒骂和删除/回复/和大声敲打的事情。无济于事。

任何人都知道在清空IBClassDescriber元素后如何恢复它?

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

谢谢! CM

1 个答案:

答案 0 :(得分:0)

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

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

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

MD在XC期望看到的目录中创建所需的.h.m文件。如果Register中的YourViewController.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。使用Refactor(右键单击类文件 - &gt;重构 - &gt;重命名)将为您更新大量内容,包括.designer文件以及整个代码中对类的任何引用
  2. 更改传递给ViewController构造函数public GrepViewController () : base ("BarViewController", null)中超类的字符串值,这是在运行时加载类所必需的
  3. 打开您的.designer文件并更改Register来电,以便维护XC和MD之间的链接:[Register ("BarViewController")] partial class BarViewController
  4. 重命名.xibBarViewController.xib
  5. 使用源代码编辑器在MD中打开BarViewController.xib(右键单击 - &gt;使用 - &gt;源代码编辑器打开)并更改-1.CustomClassName密钥:<string key="-1.CustomClassName">BarViewController</string>
  6. 保存来自MD的.xib
  7. 在XC中打开BarViewController.xib。 (如果你在MD中打开它,你需要右击 - &gt;打开方式 - &gt; XCode)。等待索引完成,然后打开“助理编辑器”。请注意BarViewController.h已正确打开。
  8. 从XC保存.xib
  9. 打开MD中的.xib并注意IBClassDescriber部分是完全指定的,即使它是空的也是如此。
  10. 发货!

    希望这有助于某人,清除XC与MD之间联系的一些谜团,或者至少提醒我下次遇到这个问题时该怎么做。

    干杯, CM