我们的第一个iPhone程序

去我的目录

<script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>

<script type="text/javascript"> </script> <script type="text/javascript"> </script>

万事开头难。

 

在大致了解了objective c 的基本特性之后,今天我们来开发自己的第一个iPhone 程序。希望能通过第一个iPhone 程序的开发,达到以下几个目的:

1)了解xCodeinterface builder 的使用。

2)大致了解iPhone 程序的基本结构

3)在模拟器上运行这个程序

 

iPhone 在任意时刻只能允许有一个application 运行(所以不可能会有后台程序),而一个application 可以有多个view (页面)。今天我们先来看看单页面(single-view )的程序。

 

我们先运行xCode

xcode

File -> New Project -> 在左侧模板中选择iPhone OS 中的 application (只有一个选项)。Apple 提供了好几个开发模板,包括Navigation based application,Open GL,View based application,window based application 等等。其中,view based application 是今天我们要介绍的。以后我们还会慢慢介绍其他的。在这些模板中,最为通用的是window based application ,它相当于是一个空模板,所有的iPhone 程序都可以基于window based 这个模板来开发。而且,所有其他提供的模板都是在window based 的基础上建立的。

 

好了,我们选择view based application ,然后给我们第一个程序命名为HelloWorld 。我们先来看一看xcode 的开发环境。左侧是workspace 浏览,右上是文件列表,右下是编辑区域。我们选中任何一个文件后,代码就会在编辑区域显示出来。

xcode workspace

在左侧的workspace 中,在HelloWorld 的工程目录下,有五个文件夹,分别是Classes,Other Sources,Resources,Frameworks,Products 。下面我们一一介绍。

1)Classes :这是源代码存放的地方。

2)Other Resources :这里面有两个文件,其中main.m 是整个程序的入口,我们在里面可以看到熟悉的int main( int argc, char* argv[] ) 。不过一般而言,我们不需要碰这个文件。HelloWorld_Prefix.pch 是一个预编译的头文件,里面是一些预先准备的头文件,一般也不用碰这个文件。

3)Resources :顾名思义,这里放的都是资源文件。如果我们的程序需要任何的外部资源,比如多媒体文件,数据库文件,都要放在这个目录下面。每一个iPhone 程序都只能访问自己的Resources ,其他程序的资源对它来说都是不可见的。所以不要希望能够通过文件系统访问其他地方的资源。

xib ,这是非常重要的一个文件类型,我们以后会经常用到。双击这个文件会启动Interface Builderxib 文件中包含了所有关于界面设计的东西。而Interface Builder 就是一个可视化的设计界面的工具,类似于MFC 或者JBuilder 中界面设计的工具。它可以采用拖拽的方式构建界面,大大简化了程序员的编码。

在这个目录中,有两个xib 文件。MainWindow 是整个程序的核心骨,每个iPhone 程序都必须有这个文件,后面我们再详细看。HelloWorldViewController 是我们这个程序的唯一一个页面(单页面程序)。

info.plist 中可以修改一些关于这个程序的属性。

4)Frameworks :这里面是一些会用到的库,类似于C++ 中的lib,dll 或者Java 中的jar 文件。今后我们会在开发其他程序的时候添加新的Framework

5)这就是存放编译好的文件的地方。现在显示是红色的,表示这个文件不存在。

 

好了。现在双击MainWindow.xib ,打开Interface Builder 。会出现四个窗口。我们一一介绍:

mainwindow

1)MainWindow

这里有5个图标:

A)Files Owner 是这个xib 文件的拥有者,它负责在程序启动的时候,从硬盘装载xib 资源文件;

B)First Responder 表示当前正在响应用户的对象,比如,用户点击了一个按钮,First Responder 就是这个按钮;如果用户正在输入文本,那么这个Text Field 就是First Responder

C)HelloWorld App Delegate 这里引入了一个新的概念:DelegateiPhone 程序开发中,经常用到delegate 。我们可以这样理解delegate ,苹果为了简化开发者的工作,隐藏了很多实现的细节,它不希望程序员有这个能力去干涉一些基本的东西;但是为了不失灵活性,又为开发者提供了一些接口;这些接口可以看作是苹果下放给程序员的有限的控制权力。不过,这些接口设计的非常好,完全覆盖了我们程序员所需要的东西。我们可以将delegate 理解为C 语言中的回调函数(callback function ),它会在特定的时候被自动调用;但是如果你不实现回调函数(也就是说只有一个空函数体的话),那么就意味着程序员放弃了这个控制的权力。

Classes 中有一个HelloWorldAppDelegate.m ,这个就是我们实现“回调函数”的地方。我们看一看这个文件中的内容,目前它只实现了一个方法,就是applicationDidFinishLaunching ,这个方法在应用程序装载完资源后调用。这里只有两行代码:

[window addSubview: viewController.view];

[window makeKeyAndVisible];

意思就是在装载完所有资源后,在主窗口中添加一个页面,然后显示。这就是我们实施控制的地方。我们不需要去关心程序是如何装载资源的,只需要关注在资源装载完毕以后,需要显示什么东西。

D)Hello World View Controller 这里我们再引入一个概念:MVC iPhone sdk 的设计遵守MVC的原则。所谓的MVC 就是Model-View-Controller ,它将数据、控制和显示分开,使得每一个部分都相对独立。我们举一个例子,在浏览网页的时候,我们看见的内容本身就是Model ,但是这些内容通过页面显示出来,这个显示的方法就是View 。比如说,同样的内容,我既可以用table 的形式展现出来,也可以用list 的形式展现出来,具体用什么形式,其实和数据本身,也就是model 无关,所以一个好的设计就需要把modelview 分开。同样,control 也是一个道理。比如,用户点击某个按钮,就会显示出所有的数据,那么这个控制的动作和数据本身(model )也没有关系,不管是什么数据,都必须显示出来;这个控制,同样,也和怎么显示(view )无关,它只是控制逻辑(显示数据)。

那么这里的Hello World View Controller 就是负责和用户交互的,将用户的命令传递给viewmodel (如果有的话)。这里,我们的程序很简单,所以没有model 。我们再回过头看这行代码:

[window addSubview: viewController.view];

这就清楚很多了吧:将Hello World View Controller 所控制的view 加入主窗口中。

E)Window 顾名思义,就是应用程序的主窗口。iPhone 程序是一个单windowview 的程序。也就是说,它只允许每一个程序拥有唯一的一个window 。我们可以在window 中加入多个页面。

 

2)这里是我们设置Controller 属性的地方。可以暂时理解为将页面上的控件和真正的代码联系起来的地方。我们下面会看到如何联系。

view controller

 

3)这是我们的控件库。

UI Library

 

4)这是我们的页面。注意到,它上面显示“Loaded From HelloWorldViewController.nib” 。这个意思就是说,这个程序的View 是从HelloWorldViewController.xib 这个文件装载的,所以真正的页面设计应该在HelloWorldViewController 中完成。

view

 

好了,既然是这样,那么我们打开HelloWorldViewController.xib 。同样会有四个窗口。找到View 窗口(如下),

UI

 

然后从控件库中拖入LabelRound Rect Button 。双击这个Button ,命名为Click 。然后双击Label ,删掉已有的文字“Label ”,调整它的大小。保存。最后的application 是,用户点击Click ,出现Hello World!

 

回到xCode ,在HelloWorldViewController.h 中添加:

 

#import <UIKit/UIKit.h>

@interface HelloWorldViewController : UIViewController {

IBOutlet UILabel * m_label;

}

@property ( nonatomic , retain ) IBOutlet UILabel * m_label;

- (IBAction) showMessage;

@end

 

 

然后在HelloWorldViewController.m 中添加代码:

 

#import "HelloWorldViewController.h"

@implementation HelloWorldViewController

@synthesize m_label;

... ...

 

- ( IBAction ) showMessage {

     m_label . text = @"Hello World!" ;

}


 

- ( void )dealloc {

    [ m_label release ];

    [ super dealloc ];

}

 

下面再介绍两个概念IBOutletIBAction 。他们都是以IB 开头,读者大概已经猜到和Interface Builder 有关系。没错,下面我们来详细解释一下。

我们虽然用Interface Builder 添加了一个label ,但是程序并不知道如何将这个控件和代码联系起来。Interface Builder 为我们提供了这种能力。关键词IBOutlet 就是告诉Interface Builder ,程序员希望能将这个变量和某个控件联系起来。

按住ctrl ,然后鼠标左键选中HelloWorldViewController.xib 中的File's Owner ;

拖拽鼠标至我们刚刚放置到View 上的Label 的上面,然后松开鼠标;

这时会看见一个popup, 选择m_label ;

这样,我们就把控件和代码联系起来了。

 

同样,我们虽然实现了一个方法,但是并没有将触发控件的事件和这个方法联系起来。关键词IBAction 就是告诉Interface Builder ,我们希望能用这个方法来响应某个事件。在函数的功能上,IBAction 可以看作是返回空(void )。

选中Click 这个button,然后组合键cmd(有一个苹果标志的键)+2,在Events 中选中Touch Up Inside ;

然后拖拽鼠标至HelloWorldViewController.xib 中的File's Owner 的上方,释放鼠标;

选择showMessage;

action 1

这样我们就完成了界面控件的事件和代码的关联。

 

编译(cmd+B )然后执行(cmd+R )。我们就能看到如下的页面。

<script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>

run

 

今天我们完成了第一个iPhone 的程序,也介绍了很多新的内容。希望读者能得到一些小的启发。今后我会陆续的介绍更多关于iPhone 的程序设计。我们还会反复强调和复习今天的内容。 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值