赞
踩
记得几个月前刚接触ios时,因为要急着完成任务,搭建应用的方式完全按照书本,而书本讲的是xcode3,而装的xcode的版本是4。所以,书上的一些东东和xcode的版本对不上,非常苦恼,为了创建一个windows base 的project,都费劲了心思。
过了几个月,回到来想想当初的问题,无非是没有理解xib的原理,没有弄清楚在ios里,如果通过xib来创建对象。
对于xib创建对象,可以从启动开始。我们来看看windows base project的做法和 single view project的做法。
一:对于 window base 的创建步骤:
第1步:将创建的xib设置为启动frame。这个可以在 target>>summary>>main interface中设置。
这有点相当于将应用的启动入口设置为本xib。
第2步:这个启动xib的file owner一定是 UIApplication。但真正的全局AppDelegate是哪个呢?
那就需要你在xib中新建一个Object,然后把类名设置为您的真正的启动代理类:xxxx_AppDelegate
注意:这里需要将启动类绑定到 file owner的delegate。(和UI元素的绑定方法一样)。
我们再看看main函数:
int retVal = UIApplicationMain(argc, argv,nil, nil);
这里没有指定启动的代理类。我猜想最后一个参数不设置的话,就会从启动xib中的UIApplication.delegate来指定。
第3步:继然是window base,那你当然需要在启动xib中创建一个window。
创建的window与代码如何对应呢?一般我们是在 xxxx_AppDelegate中创建一个UIWindow。
然后在xib中将window与代理中的实例连接上,然后代码中就直接用了,和使用一个控件一样。
这样,程序一启动,就创建了一个UIWindow。不需要你写UIWindow的创建代码。
第4步:作为一个UI程序,应该会有界面逻辑,而界面需要包含在UIViewController中,
所以,你可以在启动xib中创建UIViewController,绘制你的界面。或者直接关联别一个nib文件。
当然,你要使用它,仍然需要在xxxx_AppDelegate中声明UIViewController中的对象viewController,然后在xib中建立连接。
注意:这种方式下,UIViewController是自动创建的,不需要你写创建的代码。
最后一步:经过上面的动作。在启动代理的启动方法didFinishLaunchingWithOptions中添加以下代码就搞定了。
[window addSubview:viewController.view];
[window makeKeyAndVisible];
按照上面这种方式,我们的启动界面没有使用 alloc来创建任何ui对象,所有ui对象都是通过xib加载时自动生成的。需要注意的是,这种方式,需要将xib设置为 main interface。如果您的程序是iphone和ipad适应的,那可以设置两个不同的启动xib.
如果在xcode4中要创建 window base project,差不多就上面的套路。靠xib来生成window和viewController.
注:我也见到过没有设置main interface的程序,并且在main中也没有设置AppDelegate类。我猜想,默认为使用MainWindow.xib做为
启动Interface。好象书中的hello_world就是这样的。
二:再看看single view project的创建方式。
第1步:当然,我们不能设置 main interface。我们需要看看main函数。在其中设定启动代理类。
UIApplicationMain(argc, argv,nil, NSStringFromClass([SingViewTest_AppDelegateclass]));
在这里,第4个参数我们指定了启动的AppDelegate,而不是象上面那样,通过xib来指定启动代理类。
第2步:在启动方法中,自行创建window
self.window = [[[UIWindowalloc] initWithFrame:[[UIScreenmainScreen] bounds]] autorelease];
上面的代码创建一个全屏的窗体,看看,是我们自已alloc的。
第3步:通过程序来创建 SingelView的viewControoler.
self.viewController = [[[SingViewTest_ViewControlleralloc] initWithNibName:@"SingViewTest_ViewController"bundle:nil]autorelease];
如果您的viewController想通过xib来加载(通常的方式),那就采取上面的方式。
如果您不想使用 UI 设计器,你也可以
MyViewController *vc = [[ MyViewControlleralloc] init];
当然,这种情况你需要在viewdidLoad中动态生成您的ui元素。最后一步:将viewcontroller的ui显示出来。
self.window.rootViewController =self.viewController;
[self.windowmakeKeyAndVisible];
通过上面两个工程的创建,可以看出,ios提供两个启动入口的方式。
方式一:指定xib做为启动interface,这种方式下,需要自已指定启动AppDelegate。
可以通过创建 object,然后改类名,再绑定的方式。
这种方式下,可以以此为起点,将真正的启动window,启动ViewController在此处创建和连接。
对于简单的应用,我们还可以在这个启动的xib里,将启动的ui都画好。
方式二:在main中指定启动AppDelegate。
这个需要修改 main函数中 UIApplicationMain方法的最后一个参数。
这种方式下,启动的windows,viewController需要自已通过alloc来生成,后面的做法和方式一就没啥区别了。
写得很乱,主要是加深一下自已的记忆。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。