xib的实际操作

来源:互联网 发布:php转换特殊字符 编辑:程序博客网 时间:2024/06/06 02:46

1.加载RowView.xib文件,创建Objects下面的所有控件:

    NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"RowView" owner:nil options:nil];    

2.取出xib中的第一个子控件:

    UIView *rowView = views[0];    

3.设置头像

    UIButton *icon = (UIButton *)[rowView viewWithTag:1];

    NSString *iconName = [NSString stringWithFormat:@"01%d.png", arc4random_uniform(9)];

    [icon setImage:[UIImage imageNamed:iconName] forState:UIControlStateNormal];    

4.设置姓名

    UILabel *name = (UILabel *)[rowView viewWithTag:2];

    name.text = _allNames[arc4random_uniform(_allNames.count)];    

5.监听删除按钮

    UIButton *delete = (UIButton *)[rowView viewWithTag:3];

    [delete addTarget:self action:@selector(deleteClick:) forControlEvents:UIControlEventTouchUpInside];

方法/步骤

  1. MJViewController.h

    #import <UIKit/UIKit.h>

    @interface MJViewController : UIViewController

    {

    }

    // 添加

    - (IBAction)add:(UIBarButtonItem *)sender;

    // 删除

    - (IBAction)remove:(UIBarButtonItem *)sender;

    @property (weak, nonatomic) IBOutlet UIBarButtonItem *removeItem;

    @end

  2. MJViewController.m

    #import "MJViewController.h"

    #define kDuration 0.5

    #define kRowH 50

    #define kNameTag 10

    // 类扩展(class extension,匿名分类)

    @interface MJViewController ()

    {

        NSArray *_allNames;

    }

    @end

    @implementation MJViewController

    #pragma mark 控制器的view加载完毕的时候调用一次

    - (void)viewDidLoad

    {

        [super viewDidLoad];

        

        _allNames = @[@"西门庆", @"东门庆", @"北门庆", @"南门庆", @"中门庆"];

    }

    #pragma mark 添加一行

    - (IBAction)add:(UIBarButtonItem *)sender {

        // 0.取出最后一个子控件

        UIView *last = [self.view.subviews lastObject];

        // 这行的Y = 最后一个子控件的Y + 最后一个子控件的高度 + 间距

        CGFloat rowY = last.frame.origin.y + last.frame.size.height + 1;

        

        // 1.创建一行

        UIView *rowView = [self createRowView];

        

        // 2.添加一行到控制器的view中

        [self.view addSubview:rowView];

        

        // 3.让删除item有效

        _removeItem.enabled = YES;

        

        // 4.执行动画

        rowView.frame = CGRectMake(320, rowY, 320, kRowH);

        rowView.alpha = 0;

        

        // 4.1.开始动画

        [UIView animateWithDuration:kDuration animations:^{

            rowView.frame = CGRectMake(0, rowY, 320, kRowH);

            rowView.alpha = 1;

        }];

    }

    #pragma mark 创建一行(从xib中加载一行的view)

    // xib == nib

    - (UIView *)createRowView

    {

        // 1.加载RowView.xib文件,创建Objects下面的所有控件,并且按顺序装到数组中返回

        NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"RowView" owner:nil options:nil];

        

        // 2.取出一行的红色view

        UIView *rowView = views[0];

        

        // 3.设置头像

        UIButton *icon = (UIButton *)[rowView viewWithTag:1];

        NSString *iconName = [NSString stringWithFormat:@"01%d.png", arc4random_uniform(9)];

        [icon setImage:[UIImage imageNamed:iconName] forState:UIControlStateNormal];

        

        // 4.设置姓名

        UILabel *name = (UILabel *)[rowView viewWithTag:2];

        name.text = _allNames[arc4random_uniform(_allNames.count)];

        

        // 5.监听删除按钮

        UIButton *delete = (UIButton *)[rowView viewWithTag:3];

        [delete addTarget:self action:@selector(deleteClick:) forControlEvents:UIControlEventTouchUpInside];

        return rowView;

    }

    #pragma mark 监听删除按钮点击

    - (void)deleteClick:(UIButton *)btn

    {

        [UIView animateWithDuration:kDuration animations:^{

            CGRect tempF = btn.superview.frame;

            tempF.origin.x = 320;

            btn.superview.frame = tempF;

            

            btn.superview.alpha = 0;

        } completion:^(BOOL finished) {

            // 1.获得即将删除的这行在数组中的位置

            int startIndex = [self.view.subviews indexOfObject:btn.superview];

            

            // 2.删除当前行

            [btn.superview removeFromSuperview];

            

            [UIView animateWithDuration:0.3 animations:^{

                // 3.遍历后面的子控件

                for (int i = startIndex; i<self.view.subviews.count; i++) {

                    UIView *child = self.view.subviews[i];

                    CGRect tempF = child.frame;

                    tempF.origin.y -= kRowH + 1;

                    child.frame = tempF;

                }

            }];

            

            // 4.判断垃圾桶

            _removeItem.enabled = self.view.subviews.count > 1;

        }];

    }

    #pragma mark 监听头像按钮点击

    - (void)iconClick:(UIButton *)btn

    {

        // 1.取得按钮的父控件(因为label和btn处在同一个父控件中)

    //    btn.superview;

        // 2.获得文本标签

        UILabel *label = (UILabel *)[btn.superview viewWithTag:kNameTag];

        

        // 3.打印

        NSLog(@"名字是:%@", label.text);

    }

    #pragma mark 删除一行

    - (IBAction)remove:(UIBarButtonItem *)sender {

        // 1.取出最后一个子控件

        UIView *last = [self.view.subviews lastObject];

        

        [UIView animateWithDuration:kDuration animations:^{

            CGRect tempF = last.frame;

            tempF.origin.x = 320;

            last.frame = tempF;

            

            last.alpha = 0;

        } completion:^(BOOL finished) {

            [last removeFromSuperview];

            

            // 剩下的子控件个数 > 1就能够点击“删除”

            _removeItem.enabled = self.view.subviews.count > 1;

        }];

    }

    @end

  3. RowView.xib

0 0