xib的實際操作

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章