IOS是MacOS操作系统的一个分支,指的是Iphone Operating System,是运用于苹果手机的移动系统,目前由于苹果移动设备新增添了ipad、ipod等设备,这些设备也在使用IOS系统,苹果命名移动产品都是以"I"开头,这里采用IOS这个名字还是很合适的。
本节通过一个简单的小例子来了解一下IOS软件的开发过程。
1、要求
设计一个Iphone小程序,有两个输入框,另外有一个按钮,点击按钮后,计算出两个输入框中的值,计算结果输出到屏幕上。
2、新建工程
首先打开Xcode,选择Single View Application模板,这个模板可以创建出一个无界面切换的单窗口应用程序,如图所示:
按照如图所示设置产品名称、公司名称、域名,设备选择iPhone等:
点击下一步,设置好工程的目录(我设置的是在桌面上的MyFirstIOSApp文件夹),点击下一步即可完成向导。在桌面上生成一个工程文件夹:
整个工程项目的组织如下:
这个项目目前为止已经可以运行了,我们在项目左上角选择iPhone4S模拟器,点击运行按钮,会弹出一个Iphone模拟器,并运行我们的程序:
屏幕一片空白,这是因为我们的模板没有添加自己的东西。
3、界面设计
在工程树中,我们可以看到一个Main.storyboard文件,这个文件是开发环境为我们提供的特殊的界面描述文件,我们用文本工具打开可以发现他是一个xml文件,点击该文件,可以发现Xcode已经将其转化为可视化的窗口:
右面的窗口在程序运行的时候会自动装载到我们的手机界面。选中该窗口,在右边的设置窗口中将窗口尺寸改为3.5英尺,这是iPhone4S的尺寸:
继续从右边的窗口中找到按钮(UIButton)、标签(UILabel)、文本框(UITextField),并按照图中的样子来设置他们:
至此,我们的界面就设计好了。点击运行看看:
这个界面是运行起来了,但是没有实现任何功能。
4、设计对象的交互
在展开之前,我们首先了解一下IOS开发中广泛使用的一种模型,即MVC模型。我们知道一个应用程序包括内部数据和用户交互界面两个部分,这两个本来是对应关系的,数据更改了,界面随之改变,界面的操作影响数据。MVC模型是一种新型的模式,他在数据和界面之间增加了一个控制器,控制器和数据之间进行交互,界面和控制器之间交互,消去了数据和界面之间的耦合,也就是说,采用MVC模型,同样的数据可以采用灵活多样的展现模式,他的模型如下:
我们刚刚创建的程序也是使用MVC模型,只不过并没有涉及到具体的数据,我们设计的界面是和一个控制器进行交互的,是通过如图的方式来设置的:
数据的访问通过控制器来间接操作。该例子中的这个控制器是左边工程树中的ViewController,我们可以发现,他是一个OC对象。在程序运行时,会自动装载该控制器。在该例子中,我们需要提取两个文本框的数据,监听按钮的点击,并将结果输出到界面。我们需要在ViewController类中定义自己的属性和方法用来和视图进行交互,代码如下:
—ViewController.h 文件
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (nonatomic, weak) IBOutlet UITextField *textField1; // 用于和文本框交互的属性
@property (nonatomic, weak) IBOutlet UITextField *textField2; // 用于和文本框交互的属性
@property (nonatomic, weak) IBOutlet UILabel *outLabel; // 用于和标签交互的属性
- (IBAction)sum; // 用于监听按钮点击的方法
@end
—ViewController.m 文件
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 这个地方用来添加控制器加载时需要执行的预操作
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// 在这里可以用来清理一些多余的对象,当系统反馈内存不足的时候会执行
}
// 我们的监听方法
- (void)sum{
int a = [_textField1.text intValue]; // 提取文本框的数值
int b = [_textField2.text intValue]; // 提取文本框的数值
int c = a + b; // 求和
_outLabel.text = [NSString stringWithFormat:@"%d", c]; // 返回结果
}
@end
这样我们的工程就能运行了吗?当然不行,我们设置的属性和监听方法并不是界面上的那些元素,要和他们建立起联系,Xcode为我们提供了便捷的操作方式,仔细观察可以发现我们在定义属性和方法的时候用到了特殊的标识符IBOutlet和IBAction,这两个关键词可以在代码的行号旁边产生一个小圆圈,我们只需要用鼠标拖拽这些小圆圈到界面相应的UI控件上,即可完成链接工作。如图所示:
至此,我们的程序就算完成了,赶紧运行一下试试吧:
5、采用代码实现
我们回到工程,将界面上我们创建的文本框、按钮、标签全部删除。接下来,我们尝试通过控制器来动态创建和添加界面元素,这可以在控制器初始化方法内实现,其他代码不需要改动:
- (void)viewDidLoad {
[super viewDidLoad];
// 创建文本框1
UITextField *newTextField1 = [UITextField new];
newTextField1.borderStyle = UITextBorderStyleRoundedRect;
newTextField1.frame = CGRectMake(50, 60, 100, 30);
[self.view addSubview:newTextField1];
// 创建文本框2
UITextField *newTextField2 = [UITextField new];
newTextField2.borderStyle = UITextBorderStyleRoundedRect;
newTextField2.frame = CGRectMake(170, 60, 100, 30);
[self.view addSubview:newTextField2];
// 创建按钮
UIButton *newButton = [UIButton buttonWithType:UIButtonTypeSystem];
newButton.frame = CGRectMake(50, 130, 120, 30);
[newButton setTitle:@"计算他们的和:" forState:UIControlStateNormal];
[self.view addSubview:newButton];
// 创建标签
UILabel *newLabel = [UILabel new];
newLabel.frame = CGRectMake(170, 130, 60, 30);
newLabel.text = @"00";
[self.view addSubview:newLabel];
// 链接
_textField1 = newTextField1;
_textField2 = newTextField2;
_outLabel = newLabel;
[newButton addTarget:self action:@selector(sum) forControlEvents:UIControlEventTouchUpInside];
}
修改完成后点击运行: