在 iOS 上加载 NSBundle 文件
我想创建一个具有非常灵活的图形用户界面(可换肤)的项目。为了实现这一点,我想从外部资源(例如网站)加载 NSBundle。捆绑包应该包含与主项目中的某些属性和方法相对应的 nib(IBOutlets 和 IBActions),
Apple 似乎限制了以这种方式使用 NSBundle 的可能性。我有什么办法可以让这项工作成功吗?如果传统方法无法实现,那么推荐的替代方法是什么?
I'd like to create a project that has a very flexible graphical user interface (skinnable). In order to make this possible, I'd like to load a NSBundle from an external resource, e.g. a website. The bundle should contain nibs that correspond to some properties and methods in the main project (IBOutlets & IBActions)
It seems Apple has limited the possibility to use NSBundle in such a way. Is there any way I can make this work? If it's not possible in the conventional way, what would be a recommendable alternate approach?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
正如所承诺的,这里有一个关于我如何使它工作的简短解释。
在我的 AppDelegate 中,我检查服务器上是否有新的包(打包在 zip 文件中)。如果存在,我会下载该捆绑包。该捆绑包包含我的可换肤图形界面和其他相关数据(例如图形文件)所需的笔尖。代码看起来有点像这样:
TestAppDelegate.m
请注意,我按照 neoneye 的建议使用了 SSZipArchive 类。需要将捆绑包打包在某种容器中才能有效地下载所有内容,因为捆绑包只是一个目录和文件。文件结构遵循 Apple 的约定。
我的类之一是 ViewController,它有一个标签和按钮作为 IBOutlet。 ViewController 中最重要的代码如下所示:
TestViewController.h
TestViewController.m
实际的 nib 是在一个单独的链接项目中定义的(Cocoa NSBundle 项目,其中一些参数更改为使其适用于 iOS 设备)。该文件的所有者是 TestViewController,因此我可以访问所有插座和行动并建立适当的联系。请注意,TestViewController 中没有定义 view (UIView *) 属性,因为超类已经具有 view 属性。确保视图已在 Interface Builder 中连接。另请注意,为了便于使用,nib 文件使用与实际类相同的名称。
在网络上找不到太多有关如何执行此操作的信息,因此我希望这对许多有类似目标的人有所帮助。
As promised, here a short explanation on how I made it work.
In my AppDelegate I check if there's a new bundle (packaged in a zip file) on the server. If it exists, I download the bundle. The bundle contains the nibs I need for my skinnable graphical interface and other related data (e.g. graphic files). The code looks a bit like this:
TestAppDelegate.m
Please note I make use of the SSZipArchive class as suggested by neoneye. It's required to package the bundle in some sort of container to download all contents efficiently, since a bundle is just a directory & file structure following Apple's conventions.
One of my classes is a ViewController that has a label and button as IBOutlets. The most important code in the ViewController looks like this:
TestViewController.h
TestViewController.m
The actual nib is defined in a seperate linked project (Cocoa NSBundle project with some parameters changed to make it work for iOS devices). The file's owner is TestViewController, so I can access all outlets & actions and make the appropriate connections. Please note there's no view (UIView *) property defined in TestViewController, since the superclass already has a view property. Make sure the view is connected in Interface Builder. Also note the nib file makes use of the same name as the actual class for ease of use.
Couldn't find much information on the web on how to do this, so I hope this will be helpful to lots of people that have similar goals.
未经测试。
您可以将所有内容分发到 zip 文件中,并使用 SSZipArchive 解压缩。
untested.
You can distribute all the content in a zip file, unzip using SSZipArchive.