如何将 nib/xib 转换为目标 C 代码?

Posted

技术标签:

【中文标题】如何将 nib/xib 转换为目标 C 代码?【英文标题】:How to convert nib/xib to objective C code? 【发布时间】:2009-12-25 05:30:32 【问题描述】:

我只是想知道有没有办法将 nib/xib 文件转换为 Ojbective C 代码?我只是想找到nib/xib文件的等效代码(我试过nib2objc,结果似乎不是我想要的)。

其实我想编译这个例子

http://developer.apple.com/iphone/library/samplecode/TableSearch/index.html

没有 nib/xib 文件(我希望它与原始文件完全相同),有什么想法吗?

【问题讨论】:

只是出于好奇,你为什么要这样做?我已经完成了相当多的 iPhone 开发工作,没有 NIB 就没有太多理由工作。一旦你习惯了 Interface Builder,他们就会让这些东西的开发速度变得更快...... 在某些特殊情况下我需要这样做。所以我需要应用程序在没有 NIB 的情况下执行完全相同的操作。对此有任何想法吗? 是否存在无法使用 NIB 文件的情况?您可以在运行时使用 NSBundle 的 loadNibNamed:owner:options: 手动反序列化 NIB,因此即使您有一个时髦的、非常规的加载界面的方法,您仍然可以在视图中阅读。 如果你是 iPhone 开发新手,你真的应该使用 Interface Builder。 【参考方案1】:

查看nib2objc:

nib2objc 将 NIB 文件(或 XIB 文件)转换为 Objective-C 代码,包括每个实例的所有属性、记录的构造函数调用以及视图层次结构。

nib2objc yourfile.xib > code.m

【讨论】:

谢谢,但我是 iPhone 开发新手。如何使用这些代码? nib2objc转换的代码不包含范围按钮(用于搜索栏)。 如果您是 iPhone 开发新手,那么您可能不应该尝试重新发明众所周知的***。 指向 nib2objc 的链接似乎已失效 :-(【参考方案2】:

在一般情况下,我认为答案是否定的。笔尖不是代码;它们是序列化对象的档案。所以你要问的是,“给定一个任意序列化对象的图,我可以生成一些源代码,可以在不使用序列化的情况下创建这样的图吗?”如果在所有涉及的类中都没有对这样一个过程的特别支持,我看不出你怎么能。

询问您实际需要完成的工作可能比这种做任何事情的特定方式更有益。

【讨论】:

我同意。不应该有任何理由不使用笔尖。诚然,如果您开始一个新项目,您可以选择用代码编写所有视图而不是使用 IB,但如果您已经拥有 XIB,则没有理由将它们转换为代码并丢弃它们......跨度> 如果您正在创建本地化应用程序,那么 nib 的使用将受到限制。您可以将它们用于布局,但其余大部分设置必须在代码中完成。此外,如果您有具有大量重叠视图的特别复杂的 nib,它们将变得无法管理,因为无法在 IB 中隐藏部分。在这些情况下,在 IB 中做一些工作然后放弃它是非常有用的。能够将 nib 转换为代码可以节省大量工作。【参考方案3】:

对于所有“没有任何理由不使用 nib/xib”类型的回答,让我提供一个具体的例子作为对比。

[iPhone OS 3.1.3、3.2]

    iPhone OS 应用程序的内存有限。如果您使用过多,您的应用会被操作系统自动终止。 接口构建器使用 [UIImage imageNamed...] 将 nib/xib 中引用的图像加载到缓存中,这会耗尽内存并且不会自动释放该内存。您也无法请求释放该共享缓存中的这些图像。 在具有多个 nib/xib 文件的应用程序中,在 nib/xib 文件(即 - 背景)中布置一些大图像,您将很快拥有一个快速吞噬内存的应用程序(打开每个全尺寸 png 背景 3mbs iPad),您无法控制释放。对此有任何疑问,请查看 [UIImage imageNamed] 的文档并进行一些谷歌搜索以验证所使用的内容。

这是不使用 xib/nib 的情况。

【讨论】:

反驳: 1. 较新的iPhone OS / ios 设备比3G 和第一代iPhone 拥有更多的内存,所以这个问题正在自行解决; 2. 你提到的[UIImage imageNamed:] bug在iPhone OS 3.0中已经修复,它只涉及iPhone OS 2.x版本。 Apple 不再支持,并且 App Store 中不再允许支持 iPhone OS 2.x 的应用程序。 3. 这是一个关于大图像的明显内存需求的问题,而不是关于 NIB 文件本身的问题。免责声明:我是 nib2objc 的创建者,所以我的观点是有偏见的,我尽可能和适当地使用 XIB/NIB。【参考方案4】:

我认为,如果您只想为以编程方式创建的视图创建一个起点,而该视图的创建方式并不容易或无法使用 Interface Builder 完成,那么我认为这样做是有意义的。如果您想将视图层次结构捆绑到静态库中以使其完全独立,这也很方便。理想情况下,如果可能的话,你想使用笔尖。这将使国际化更容易。但是,您仍然可以使用字符串文件支持国际化。

【讨论】:

以上是关于如何将 nib/xib 转换为目标 C 代码?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 上反编译或解释 XIB/NIB 文件

如何将 iOS 项目更改为根本不使用 nib 而只使用 Objective-C 代码?

如何将代码 AVFoundation 目标 c 转换为 Swift?

如何将目标 C 推送通知代码转换为 Swift

为啥这段代码不能加载我的 NIB/XIB

访问,从单个 nib 获取对多个视图的引用