软件创富密码:iPhone应用程序开发攻略之iPhone特色传感器应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

21.3 创建并改造工程

对于该性别预测应用程序,我们仍然采取不使用Interface Builder工具的开发方式。在Xcode中首先创建名为GuessChild的工程,然后删除其中默认生成的xib文件,将其改造成不依赖Interface Builder工具的工程,最后追加21.2节中设计的各个画面的类以及实现代码。

21.3.1 创建工程

启动Xcode后,从主菜单中选择File→New Project命令,将显示如图21.5所示的画面,然后选择Window-based Application选项。

图21.5 选择Window-based Application选项

单击Choose按钮后,在如图21.6所示的画面中选择合适的保持目录,输入工程的名称“GuessChild”,然后单击Save按钮,工程创建完成。

图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文件物理删除。

图21.7 删除MainWindow.xib

图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文件相关的所有信息就被删除了。

图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了。