![软件创富密码:iPhone应用程序开发攻略之iPhone特色传感器应用](https://wfqqreader-1252317822.image.myqcloud.com/cover/221/656221/b_656221.jpg)
21.3 创建并改造工程
对于该性别预测应用程序,我们仍然采取不使用Interface Builder工具的开发方式。在Xcode中首先创建名为GuessChild的工程,然后删除其中默认生成的xib文件,将其改造成不依赖Interface Builder工具的工程,最后追加21.2节中设计的各个画面的类以及实现代码。
21.3.1 创建工程
启动Xcode后,从主菜单中选择File→New Project命令,将显示如图21.5所示的画面,然后选择Window-based Application选项。
![](https://epubservercos.yuewen.com/015AA4/3590314103999101/epubprivate/OEBPS/Images/Figure-0012-7027.jpg?sign=1738896672-L919kGlZVS54fQDJoOHSotl4PUpqNz6e-0-17ef27dbd561042bce79dc86d0374ee6)
图21.5 选择Window-based Application选项
单击Choose按钮后,在如图21.6所示的画面中选择合适的保持目录,输入工程的名称“GuessChild”,然后单击Save按钮,工程创建完成。
![](https://epubservercos.yuewen.com/015AA4/3590314103999101/epubprivate/OEBPS/Images/Figure-0012-7039.jpg?sign=1738896672-7TGBYuAcTZ6wp8EXeEBf0syZ53QO5GYo-0-814630df82087ad479601d9abc1f7747)
图21.6 创建GuessChild工程
21.3.2 改造GuessChild工程
本节讲解如何删除xib文件,将工程改造成不使用Interface Builder工具的工程。
1.编辑GuessChildAppDelegate.m
为了删除GuessChild工程中的MainWindow.xib文件,我们首先要重新编辑 GuessChildAppDelegate.m文件,将要在MainWindow.xib中完成的工作转移到GuessChildAppDelegate.m中。
双击GuessChildAppDelegate.m文件,在代码编辑窗口中编辑GuessChildAppDelegate.m的application:didFinishLaunchingWithOptions:方法,其他的只有定义的方法可以删除,不过保留着也没有什么问题。方法application:didFinishLaunchingWithOptions: 中追加的代码如下。
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. [window makeKeyAndVisible]; return YES; }
2.删除MainWindow.xib文件
选择Groups&Files最上层的GuessChild,Xcode的中央窗格中会显示工程中包含的所有文件及框架,如图21.7所示。选中MainWindow.xib文件并单击鼠标右键,在弹出的快捷菜单中选择delete命令后,在对话框中单击Also Move to Trash按钮(见图21.8),即可将MainWindow.xib文件物理删除。
![](https://epubservercos.yuewen.com/015AA4/3590314103999101/epubprivate/OEBPS/Images/Figure-0013-7386.jpg?sign=1738896672-S9exGivevuil1DeozoDeD5lFcJyHVdHY-0-06c3e495fc85c0d248cba7c054249b68)
图21.7 删除MainWindow.xib
![](https://epubservercos.yuewen.com/015AA4/3590314103999101/epubprivate/OEBPS/Images/Figure-0014-7716.jpg?sign=1738896672-NTCyVvQgGt1umYNERtlECj5Bz94nNRrB-0-e34207f89e772ee71c7be4647e7435df)
图21.8 单击Also Move to Trash按钮
只进行上述的物理删除操作,还不能完全删除MainWindow.xib文件的残余,我们还必须编辑Guess Child-info.plist文件。双击如图21.7所示的窗口中的GuessChild-info.plist文件,我们可以发现该文件的编辑窗口(见图21.9)的最后有key为Main nib file base name的项目,右键单击此项目,在弹出的快捷菜单中选择cut命令,即可将此项删除。记住别忘了一定要保存所有修改。这样与MainWindow.xib文件相关的所有信息就被删除了。
![](https://epubservercos.yuewen.com/015AA4/3590314103999101/epubprivate/OEBPS/Images/Figure-0014-7728.jpg?sign=1738896672-3XS4RQkSh0M21lAmptitvIyWwf3kxAtD-0-b6337e83bbe3b62cab1f0104c0fe3b3b)
图21.9 编辑Guess Child-info.plist文件
3.编辑main.m文件
删除了MainWindow.xib文件,便不依赖Interface Builder工具了,同时也去掉了由Interface Builder相关框架完成的创建窗口的处理。若要恢复创建窗口的处理,则要首先编辑main.m文件。双击如图21.7所示的窗口中的main.m文件,打开编辑窗口。然后将其中调用UIApplicationMain函数的代码修改成如下的样子。
//原代码 //int retVal = UIApplicationMain(argc, argv, nil, nil); //只修改第4个参数 int retVal = UIApplicationMain(argc, argv, nil, @"GuessChildAppDelegate");
这样的修改是将原来自动设置的应用程序委托(本例为 GuessChildAppDelegate,所谓应用程序委托,是当应用程序状态变化时接受通知的对象,也是继承了UIApplicationDelegate协议类的实例),在此明确地指定了而已。UIApplicationMain函数的第4个参数正是用于指定应用程序委托的参数。如果此参数为nil,则会根据info.plist文件中设置的nib或者xib文件,系统自动确定为应用程序委托。因为前面已经删除了xib文件,所以在此必须指定字符串“GuessChildAppDelegate”代表的类名来指定应用程序委托。
4.再次编辑GuessChildAppDelegate.m文件
编辑完main.m后,还不能正常编译整个GuessChild工程。在 GuessChildAppDelegate.m文件中,有编程经验的用户可以注意到,window实例变量还没有被初始化。因此还必须再编辑一下GuessChildAppDelegate.m文件,从而完成window实例变量的初始化动作。
需要在 application:didFinishLaunchingWithOptions:方法的最上部追加如下初始化window实例变量的代码。
//自己创建window对象 CGRect bounds = [[UIScreen mainScreen] bounds]; window = [[UIWindow alloc] initWithFrame:bounds];
上述代码正是将以前由MainWindow.xib自动创建的窗口(UIWindow)实例,在此由自己手动创建。
UIWindow实例的创建不是一件很难的事情,先调用alloc方法生成UIWindow的实例,然后调用 initWithFrame:方法对其进行初始化。此处,需要取出UIScreen类的bounds属性设置画面的大小,并以参数的形式传入。
这样整个GuessChild工程就不再依赖于Interface Builder了。