`
weiqingfei
  • 浏览: 317469 次
  • 性别: Icon_minigender_1
  • 来自: 黑洞
社区版块
存档分类
最新评论

有关Nib文件的那些事。

阅读更多
用过delphi的童鞋应该比较清楚frm文件,就是用鼠标拖拖拉拉,就能设计好的那个窗体所生成的文件。
在使用xcode进行开发时,也用了同样的形式,把复杂的页面通过简单的拖拉以及属性设置来设计出来,然后序列化到Nib文件里,等程序运行的时候,加载进来就可以了。

在xcode进行窗体开发时,有两种形式把Nib文件反序列化。
一种是通过设置view controller的NIB File属性。
另外一种便是通过initWithNibName方法。

第二种其实没什么好说的,就是读取nib文件,加载,反序列化,生成实例,显示。

对于第一种,有些地方做的有些蹊跷,百思不得其解。
假设要为主窗体Window添加一个View,xcode中现有View-based模板的做法是,先创建一个带Nib文件(假设为MyViewController.xib)的UIViewController自定义子类(假设为MyViewController.m)。
然后把MainWindow.xib中的View Controller实例的class name设为这个自定义子类MyViewController,并指定NIB File为刚才创建的Nib文件(MyViewController.xib)。

但是经过测试,其实只要设定了class,不指定NIB File也是可以的。

当然如果在delegate里使用viewController的超类UIViewController来定义property的话(这样做的目的是能把MainWindow.xib中的View Controller的插头,插到delegate里的插座上),也可以只指定NIB File来实现加载。

但是如果把class name和NIB File设成各自不关联的类和nib文件会怎样呢?
答案是以NIB File为主。

比如说,我们设定delegate的property为UIViewController。
但是可以指定MainWindow.xib中View Controller的class为MyViewController1(其对应Nib文件为MyViewController1.xib)
但是我们设定这个View Controller的NIB File为MyViewController2.xib(其File Owner为MyViewController2.m),那么实际加载进来的是MyViewController2.xib里的View。

在设计MainWindow.xib中View Controller的时候,除了加载其他的Nib文件外,也可以直接设计其View,也就是说不需要另外的nib文件,直接在MainWindow.xib进行设计。当两者同时进行的时候,以MainWindow.xib中设计的窗体为主,也就是说即使load了其他Nib文件,也不会呈现出来。

对于有洁癖,或者有重度自我强迫症的人来说,是不需要这种快餐式的设计的。
那就是抛弃一切Nib文件,所有的窗体设计都在代码中完成。
改造Window-Based模板,
1.从project中删除MainWindow.xib文件
2.从Info.plist中,删除Main nib file base name项
3.编辑main.m
把这句
int retVal = UIApplicationMain(argc, argv, nil, nil);

改为
int retVal = UIApplicationMain(argc, argv, nil, @"___PROJECTNAMEASIDENTIFIER___AppDelegate");

4.编辑___PROJECTNAMEASIDENTIFIER___AppDelegate.m
把方法
- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    // Override point for customization after application launch
    [window makeKeyAndVisible];
}

改为
- (void)applicationDidFinishLaunching:(UIApplication *)application {
    UIWindow *wd = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window = wd;
    [wd release];
    [window makeKeyAndVisible];

}


当然,不改写模板程序,使用window-based模板生成框架后,按照上述方法改写程序也是可以的。
分享到:
评论
3 楼 phaibin 2011-06-11  
我的试验结果是:ViewController会自动寻找同名的nib来实例化,所以不需要在MainWindow.xib那里指定nib的文件名。但是其他类的子类,比如UITableViewController的子类又不会自动匹配,不知道是故意这么设计的还是bug。所以还是不要太依赖利用名字匹配,乖乖地指定nib文件名比较保险。
2 楼 weiqingfei 2010-12-19  
dazuiba 写道
你写到:
1 ...然后把MainWindow.xib中的View Controller实例的class name设为这个自定义子类yViewController,

2.  并指定NIB File为刚才创建的Nib文件(MyViewController.xib)。

一般做好第一步就一切ok了,我貌似从来没有在反向指定一次的? Interface Builder 有这个功能么?


可能是我表述的有点儿问题,这儿不是反相指定,是说用IB打开MainWindow.xib后,选中View Controller,然后在属性设置里有两个设置,一个是class name,另外一个就是NIB Name。
用模板创建的view-base的project默认是这样设置,但是我试验下来,不设定NIB Name也是可以的。
1 楼 dazuiba 2010-12-19  
你写到:
1 ...然后把MainWindow.xib中的View Controller实例的class name设为这个自定义子类yViewController,

2.  并指定NIB File为刚才创建的Nib文件(MyViewController.xib)。

一般做好第一步就一切ok了,我貌似从来没有在反向指定一次的? Interface Builder 有这个功能么?

相关推荐

    Nib文件是什么?Nib文件打开方法

    Nib文件在iOS和macOS开发中扮演着至关重要的角色,它是Cocoa应用程序界面设计的核心组成部分。Nib(Interface Builder Document)文件是一种XML格式的文件,用于存储用户界面元素的布局和状态,如窗口、视图、按钮等...

    IPHone 自己加载nib文件显示UITable的例子

    在iOS开发中,`nib`(Interface Builder Document)文件是一种用于存储用户界面布局和对象的XML文件,常被用来创建和设计UI组件。在这个例子中,我们将探讨如何在iPhone应用中通过代码自行加载`nib`文件来显示一个`...

    xib转nib脚本.zip

    3. 写入NIB文件:转换后,脚本会将新的数据结构写入NIB文件,保持原有的UI布局和控件设置不变。 4. 可能的后处理:根据具体需求,脚本可能还需要执行一些后处理步骤,例如更新引用、资源路径等。 使用这个脚本,...

    IOS无nib文件实现tableview

    "IOS无nib文件实现tableview"这个DEMO就是展示了如何在不使用nib文件的情况下,通过代码实现UITableView的所有功能。 首先,我们需要了解UITableView的基本结构。UITableView由一系列UITableViewCell组成,每个cell...

    nib2objc源码

    - `OutletConnector`: 可能用于处理.nib文件中的连接信息,如IBOutlet和IBAction,生成相应的Objective-C代码。 3. **代码生成**: nib2objc的工作流程大致分为读取.nib文件、解析文件内容、构建对象模型、生成...

    使用NIB父类来创建UIVIEW

    通过使用NIB文件,开发者可以脱离代码,直观地设计UI元素,然后在运行时加载到应用中。本篇文章将深入探讨如何利用NIB文件作为父类来创建`UIView`,从而提高开发效率和代码可复用性。 首先,我们需要了解什么是`NIB...

    nib2objc 将XIB文件自动转换为Objective-C的源代码文件

    nib2objc是一个小巧的转换工具,可以将XIB文件自动转换为Objective-C的源代码文件。 通常,考虑到程序的效率时,才将XIB直接转换为源代码文件。但是这样一来,通过Interface Builder设定的实例变量与行为方法的接续...

    nib2objc工具

    nib2objc工具是一款针对iOS开发的实用小工具,它的主要功能是将.xib或.storyboard文件转换为Objective-C代码,方便开发者快速地将界面设计与代码实现相结合。在这个过程中,nib2objc能够帮助开发者节省大量的手动...

    半手工打造一個Viewer (配合NIB)

    博主可能会讲解如何在NIB文件中创建Viewer的实例,设置其大小、位置以及其他属性,并连接到代码中的IBOutlet和IBAction。 3. **代码与界面交互**:结合NIB,开发者通常需要在代码中加载NIB文件并将其中的对象实例化...

    nib.sh shell文件

    nib.sh shell文件

    IOS应用源码之【应用】NIB to Objective-C converter.rar

    - `NSNib`类是Objective-C中用来加载和解析NIB文件的关键类,它负责创建并初始化与NIB文件相关的对象。 3. NIB to Objective-C转换器的工作原理: - 这个转换器工具读取NIB文件的XML内容,然后将其转换成...

    nib开发 ui设计

    根据提供的文件信息,我们可以归纳出以下关键知识点,主要聚焦于iPhone用户界面(UI)设计与nib文件开发: ### 一、nib文件及其在iOS开发中的应用 #### 1.1 nib文件概述 - **定义**:nib(NeXT Interface Builder)...

    ios 反编译工具

    它支持32位和64位的Mach-O文件(iOS应用程序的主要格式)的反编译,并且能够解析Objective-C和Swift代码。Hopper不仅提供了反汇编功能,还能进行静态分析,帮助开发者理解应用程序的工作原理。 Hopper的主要特性...

    IOS应用源码之akosma-nib2objc-1.4-12-gcde9b9e.zip

    该项目的核心功能在于将.nib文件转换为Objective-C类,这样开发者可以直接在代码中初始化和管理UI组件,而无需依赖nib文件加载。这在某些场景下非常有用,例如自动化测试、代码审查或减少运行时内存占用。 在akosma...

    addChildViewController transitionFromViewController nib storyboard

    每个.nib文件对应于一个界面,可以包含一个或多个UIViewController实例,以及其他UI元素如UILabel、UIButton等。开发者可以在Interface Builder中直观地设计和布局界面,然后在运行时加载这些.nib文件。 相比之下,...

    NibToXibConverter:简单的应用程序,将nib转换为xib

    这个工具对于那些拥有大量 nib 文件的项目,但又希望转向使用 xib 的开发者来说非常有用。它利用了Apple的ibtool命令行工具,这是一个内置在Xcode中的工具,能够处理 nib 和 xib 文件,包括编译和解包。 ibtool在...

    NibUnlocker

    NibUnlocker的应用场景主要在于那些希望深入底层查看和调试nib文件,或者对非标准方式处理UI元素的开发者。 使用NibUnlocker,你可以: 1. **查看nib/xib文件结构**:通过NibUnlocker,用户可以查看 nib 文件的...

    nib:这是一个CLI软件包,可简化您作为Node JS开发人员的工作

    “nib-main”可能是指该压缩包的主要或核心文件,通常在CLI工具中,这样的文件会包含启动程序或执行命令的主入口点。在Node.js中,这通常是一个名为“index.js”或类似的文件,但这里使用了“nib-main”,可能意味着...

Global site tag (gtag.js) - Google Analytics