iOS开发学习笔记 -- (二)动态添加控件和事件处理

时间:2022-12-15 13:03:05

刚开始学iOS开发的时候,经常要跟interface builder打交道,乍一看拖控件是挺方便的,跟以前做C#开发类似,但是Xcode比较恶心的一点是,拖完控件之后,还得手动地在Connections Inspector中绑定控件和变量的关系,事件的绑定也在这里完成。当然如果这些都有一个源代码给我们看到,倒也还好(比如C#中的xx.designer.cs),但是Xcode又全部给扔到了.xib文件中,这是一个XML文件,看起来并不像看代码那么直觉,所以是一件比较蛋疼的事情。

另一方面,如果使用interface builder,针对不同的iOS版本,不同的orientation(屏幕方向),我们可能需要设计多套UI,这在开发和维护上都是一件比较蛋疼的事情。

因此,我们考虑一种更“程序员”的方式来做这些事情:抛开Interface Builder,在代码中创建控件,定义布局,并添加事件处理机制。

下面的例子演示动态添加一个按钮以及绑定点击事件。

首先打开Xcode,创建一个新项目,可以是Single View,也可以是Empty的,我们以Single View的为例。

虽然创建的项目中有一个MainStoryboard.storyboard,并且绑定了interface builder,但我们不会去用它。我们直接修改ViewController.m的viewDidLoad方法,修改后代码如下:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn2.frame = CGRectMake(10, 10, 80, 30);
    btn2.tag = 2;
    [btn2 setTitle:@"Hey~" forState:UIControlStateNormal];
    [btn2 addTarget:self action:@selector(onClickOK:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn2];
}
首先,创建一个UIButton,它的frame属性表示它的位置和大小信息,我们用CGRectMake方法,四个参数的意思分别是:x, y, width, height。

接下来设置tag,标题。

然后是比较关键的一行,绑定TouchUpInside事件的处理方法到onClickOK。

最后将控件添加到subView中。

指定了处理方法,接下来我们来实现onClickOK方法,在ViewController.m中添加下面的方法:

-(IBAction)onClickOK:(id)sender{
    UIAlertView *alert =
        [[UIAlertView alloc] initWithTitle:@"Alert" message:@"You got me!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
}
这个方法会弹出一个对话框,并显示"You got me!”,很简单,绑定其他事件也是类似的。