更实际的情况是,在程序运行开始时,程序已经具有一个初始的程序界面(初始界面可能只包含一个UIView),在程序运行过程中,程序需要根据用户交互来动态添加、删除UI控件。
在这种需求下,我们可以通过Interface Builder来设计程序的初始界面;接下来在程序运行过程中,可以通过代码创建UI控件,再将UI控件添加到相应的父控件中即可。
实例:动态添加、删除标签
首先创建一个iOS的Single View Application应用,创建完成后,该应用将自带一个Main.storyboard界面设计文件,但我们并不打算修改该界面设计文件,而是直接在程序代码中创建整个UI界面,程序只使用该界面文件中的UIView作为容器即可。
接下来修改控制器类,在控制器类的实现部分创建整个程序界面,绑定事件处理方法。下面是控制类的实现部分代码。
程序清单:codes/09/9.5/DynaLabel/DynaLabel/FKViewController.m
#import "FKViewController.h"
// 定义FKViewController的扩展
@interface FKViewController ()
// 定义一个属性来记录所有动态添加的UILabel控件
@property (nonatomic, strong) NSMutableArray* labels;
@end
@implementation FKViewController
// 定义一个变量来记录下一个将要添加的UILabel的位置
int nextY = 80;
- (void)viewDidLoad
{
[super viewDidLoad];
// 设置该view的背景色
self.view.backgroundColor = [UIColor grayColor];
// 初始化labels数组
self.labels = [NSMutableArray array];
// 创建UIButtonTypeRoundedRect类型的UIButton对象
UIButton* addBn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
// 设置addBn的大小和位置
addBn.frame = CGRectMake(30, 30, 60, 40);
// 为UIButton设置按钮文本
[addBn setTitle:@"添加"
forState:UIControlStateNormal];
// 为addBn的Touch Up Inside事件绑定事件处理方法
[addBn addTarget:self action:@selector(add:)
forControlEvents:UIControlEventTouchUpInside];
// 创建UIButtonTypeRoundedRect类型的UIButton对象
UIButton* removeBn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
// 设置removeBn的大小和位置
removeBn.frame = CGRectMake(230, 30, 60, 40);
// 为UIButton设置按钮文本
[removeBn setTitle:@"删除"
forState:UIControlStateNormal];
// 为removeBn的Touch Up Inside事件绑定事件处理方法
[removeBn addTarget:self action:@selector(remove:)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:addBn];
[self.view addSubview:removeBn];
}
- (void)add:(id)sender {
// 创建一个UILabel控件
UILabel* label = [[UILabel alloc] initWithFrame:
CGRectMake(80, nextY, 160, 30)];
label.text = @"疯狂iOS讲义"; // 设置该UILabel显示的文本
[self.labels addObject: label]; // 将该UILabel添加到labels数组中
[self.view addSubview:label]; // 将UILabel控件添加到view父控件内
nextY += 50; // 控制nextY的值加50
}
- (void)remove:(id)sender {
// 如果labels数组中元素个数大于0,表明有UILabel可删除
if([self.labels count] > 0)
{
// 将最后一个UILabel从界面上删除
[[self.labels lastObject] removeFromSuperview];
[self.labels removeLastObject]; // 从labels数组中删除最后一个元素
nextY -= 50; // 控制nextY的值减50
}
}
@end
上面的代码中,第一段粗体字代码创建了应用的初始界面,该初始界面只包含两个按钮,并且程序还为这两个按钮绑定了事件处理方法。
提示:
上面程序中多次使用了CGRectMake()函数,该函数专门用于创建一个CGRect对象。当使用代码来创建UI控件时,总需要控制UI控件的大小和位置,通常都会用CGRect结构体,它代表一个矩形区的大小和位置。CGRect结构体包括origin、size两个成员,其中origin又是CGPoint类型的一个结构体,它包括x、y两个成员,代表该矩形区左上角的位置;size又是CGSize类型的一个结构体,它包括width、height两个成员,代表该矩形区的宽度和高度。正如CGRectMake()函数可返回一个CGRect结构体一样,CGPointMake(x,y)可返回一个CGPoint结构体,CGSizeMake(width,height)可返回一个CGSize对结构体。
该应用的关键就是实现add:和remove:两个方法,其中add:方法中粗体字代码负责创建一个UILabel控件(每次创建的UILabel的Y坐标并不相同),并将这个UILabel控件添加到该控制器关联的UIView内。这样即可实现每次用户触碰该按钮,程序界面就会添加一个UILabel控件;而remove:方法中粗体字代码则负责把labels数组的最后一个元素(UILabel控件)从父控件中删除,并从该数组中删除该元素。
通过上面的程序,即可实现通过用户交互来动态添加、删除程序界面控件。编译、运行该程序,并多次触碰添加、删除按钮后,可能看到如图9.37所示的动态界面。
![Uploading screenshot . . .]()
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。