Cocoa 如何将.xib文件转换为UI元素?

Cocoa 如何将.xib文件转换为UI元素?,cocoa,cocoa-touch,interface-builder,xib,Cocoa,Cocoa Touch,Interface Builder,Xib,据我所知,MainMenu.xib包含用于为应用程序创建主菜单的XML。我的问题是,这个文件是如何加载、读取和用于创建主菜单的?有谁能帮助我理解将MainMenu.xib转换为UI中实际主菜单的代码的内部工作原理吗 以下是我到目前为止对这个过程的理解 MainMenu.xib被编译成.nib .nib被加载到UINib对象中 从这里开始,UINib对象以某种方式用于创建主菜单 这是我感到困惑的部分。UINib对象用于创建主菜单的确切方式是什么?想象一下另一种方式:在运行的应用程序中,内存中有一个

据我所知,MainMenu.xib包含用于为应用程序创建主菜单的XML。我的问题是,这个文件是如何加载、读取和用于创建主菜单的?有谁能帮助我理解将MainMenu.xib转换为UI中实际主菜单的代码的内部工作原理吗

以下是我到目前为止对这个过程的理解

  • MainMenu.xib被编译成.nib
  • .nib被加载到UINib对象中
  • 从这里开始,UINib对象以某种方式用于创建主菜单
    这是我感到困惑的部分。UINib对象用于创建主菜单的确切方式是什么?

    想象一下另一种方式:在运行的应用程序中,内存中有一个实时视图层次结构。现在,您希望在保存UI状态的同时终止程序。你会怎么做?您可以将实时视图的所有重要属性写入磁盘;某种序列化和归档过程

    这就是nib的全部功能:它是一组碰巧是视图的对象的存档。(当然,在任何用户交互之前,它会对视图的“基本”状态进行编码。)正如您正确指出的,xib是该归档文件的XML呈现,这使它能够更好地与版本控制配合

    如果您在Xcode中查看xib的XML,您将看到它由如下条目组成:

    <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="161" id="KGk-i7-Jjw" customClass="LeakInfoStepsCell" customModule="LookoutEmailLeakAlert" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="320" height="170"/>
            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
    ...
    
    
    ...
    

    只是视图上各种属性的列表,以及nib未归档时它们应该具有的值。因此,当您加载UINib时,它会读取这些属性并创建视图对象,就像您可能在代码中手动执行的操作一样,或者就像您通过
    NSCoding对自己的对象执行的操作一样。这个问题太广泛了,无法问下去StackOverflow@BarryMichaelDoyle好的,谢谢你提醒我!关于如何使其更具体,使其符合StackOverflow准则,有什么建议吗?谢谢!这实际上帮助很大。我有一种令人毛骨悚然的想法,认为UINib类背后有某种“魔力”,但我发现事实并非如此。这很有帮助——非常值得赞赏:)我承认这是基于推理的,实际上没有见过UINib代码,但我不相信这其中有任何真正的魔力。很高兴我能帮上忙。这个推理对我来说很有意义!另外,还有一个问题——假设我想阅读MainMenu.xib并手动创建主菜单(即,在.xib中定义我自己的“文件”、“视图”等选项,解析.xib,然后从这个.xib创建主菜单)。我现在明白了如何读入和解析MainMenu.xib中的数据,但您是否有任何关于如何从那里创建主菜单的提示?为了澄清,我明白如果我有一个名为SomeView的UIView子类,并且我正在读取一个.xib文件,该文件描述了作为SomeView实例的UI元素,这将如何工作(我只需解析.xib并按照指定创建SomeView的实例)。我的问题是关于主菜单是如何创建的。主菜单是否也使用UIView的子类表示,或者是否有特殊的操作?如果这是一个糟糕的问题,请道歉,只是想找一些提示来为我指明正确的方向!:)OSX上没有UIView——有NSView——而且iOS中通常没有“主菜单”xib,所以我有点搞不懂你在问什么。但是在由Xcode为OS X项目创建的默认main menu.xib中,您可以看到一个
    菜单
    对象,它表示菜单栏的
    NSMenu
    实例。您可以向其中添加NSMenuItems,但您可以在代码中或通过Interface Builder进行添加。您不需要重新发明NSNib。