ios学习之路(一)也说说HelloWorld

来源:互联网 发布:linux nginx 全局变量 编辑:程序博客网 时间:2024/05/11 04:46

最近转到ios开发,年岁渐大记忆渐弱,blog一下,分享自己的ios学习过程,共同进步。


环境介绍:OS X10.9.4, Xcode 6.1


1. HelloWorld Xcode默认工程生成版

这个版本的图文版我觉得就没有必要再来一个了,首先它生成过程极其简单,Xcode也做得很好,其次这样的“教程”网上比比皆是。一句话总结就是新建一个Single View Application,然后一直下一步,完成之后,打开Main.storyboard,从右下角的Object Library里拖一个Label进去写上HelloWorld,然后运行程序。

图1            图2

Xcode为我们生成了(图1)的工程目录,开始看到这样的目录结构,还是有蛮多疑问的。

首先这个Main.storyboard是怎样在主程序中设定进去的,说objective-c是c超集,那以往经验告诉我在main函数中应该有UI的初始化过程和主事件循环的启动,这个storyboard虽然是UI可编辑工具,但也需要以某种方式加载。

于是查看工程生成的文件,最后在YHHello-Info.plist里找到了结果(如图2):这个文件里有一个选项是Main storyboard file base name,指定了Main,尝试修改名称Main,运行程序,果然无法显示HelloWorld,验证了猜想。 简单说一下,plist是property list文件,是xml格式的属性文件,在ios开发中很常用到,而这里的这个app-Info.plist可以看成是程序的manifest,配置了应用程序的基本信息(这里是笼统的说法,以后也许会详细说明)。


2. HelloWorld 乞丐版

自动的好处是免去重复性工作,但是作为开发者,我们还是要在享受自动化前,弄清楚整个程序工作流程,了解才能更好的运用嘛。所以我准备去掉Xcode给的伪装,来写一个乞丐版的HelloWorld。

a. 首先删除Main.storyboard, YHViewController.h YHViewController.m以及图2显示的那条property。此时运行程序,应该会看到一个黑色屏幕。

b. 打开YHAppDelegate.m, 修改- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    // Override point for customization after application launch.    _window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(20, 20, 100, 50)];    label.backgroundColor = [UIColor greenColor];    label.text = @"Hello World";    [_window addSubview:label];    [_window makeKeyAndVisible];    return YES;}

c. 运行程序,看到黑底绿色背景的HelloWorld。


3. 从乞丐版入手分析ios HelloWorld程序

我刚入手ios helloworld程序时候,有很多问题,比如为什么需要这个appdelegate类,UI的层次结构是怎样的,HelloWorld是具体怎样显示在手机上的,主事件循环是在那里开启的等等,下面试试找出头绪。

首先看main函数,其中重要的一行代码

 return UIApplicationMain(argc, argv, nil, NSStringFromClass([YHAppDelegate class]));

查看一下UIApplicationMain方法的注释,函数声明如下:

int UIApplicationMain (   int argc,   char *argv[],   NSString *principalClassName,   NSString *delegateClassName);
这个函数做了如下的事情:

a. 使用principalClassName参数来初始化UIApplication, 一般来说参数principalClassName是UIApplication的子类,如果为nil,那么初始化UIApplication类。

b. 使用delegateClassName参数来初始化UIApplicationDelegate, 一般来说参数是实现了UIApplicationDelegate协议的类,如果为nil,那说明你要从程序的主nib文件中加载delegate。

c. 给UIApplication设置delegate类。

d. 设置主事件循环,并且开始处理事件

e. 如果应用程序的info.plist中有指定main storyboard或者main nib文件,那会加载这些文件。


这里借用一下网络上童鞋的图片来说明这个流程(来自http://my.oschina.net/ifengzi/blog/93744)



那看到这里,有一些问题是需要交代一下的:(上次保存成草稿,时间太长,忘了当时要交代什么了尴尬

UIApplication https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/cl/UIApplication


4. HelloWorld Storyboard 转Xib版

看到公司工程代码中都是用Xib来展示UI,而不是我在学习时候用得storyboard, 于是考虑同样用配置文件能不能加载Xib呢?

下意识地,像乞丐版一样,我删除了图2显示的property,然后加上了main nib file base name, 指定为自己新创建的一个xib文件,然后运行,发现程序显示白板,并没有显示出我在xib中的"hello world" UILabel。网上查都是说有这么个property,但是少有告诉如何从storyboard工程转到xib的(为了搞清楚xib和storyboard不同,我并不是想要在代码中loadNibNamed 这样的实现),上次记博客停下来就是因为这个耽误时间较长...汗
后来参考了这个 http://stackoverflow.com/questions/7764917/delete-storyboard-xcode-4-2-ios-5 ,终于实现, 分为以下步骤:

a. 删除storyboard文件和info.plist中的property配置,删除生成的XXViewController的.h 和.m文件
b. 新建一个xib文件,在info.plist中添加main nib file base name的配置
c. 打开新建的xib文件,点击File's Owner,在右侧identity inspector里将custom class指定为UIApplication。
d. 在右下角Object library里拖一个Objects 加入xib, 选中,在右侧identity inspector里将custom class指定为生成的XXAppDelegate
e. 将xib中得view删除掉,在右下角Object library里拖一个window加入xib, 然后再拖一个label到window里,写上"hello world"

运行,成功显示。


5. 产生了一堆Why?

从上面的学习过程,产生了很多问题,尤其到第四个问题的时候,会发现关于ios 系统对于代码和IB之间的交互合作机制还是有很多问题的。由此以后会产生专门的博客来记录分析吧,先列几个问题以记录。
a. IB上storyboard和xib,具体是怎样与代码合作的
b. 从xib到现在的storyboard, 结构是发生了变化的,比如关于File's Owner在storyboard上的消失


ok, 这篇就到这里。




0 0