码迷,mamicode.com
首页 > 其他好文 > 详细

Snail—UI学习之表视图TableView(二)

时间:2015-07-30 21:25:44      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

接着上面的项目 ,当下面标记红色的代码写上后,我们按下右上角的edit按钮 就可以对cell进行插入、删除、移动等操作


#import "WJJRootViewController.h"

@interface WJJRootViewController (){
    //数据源 存放数据
    NSMutableArray * _dataArray;
    //这就是我们的tableView
    UITableView * _tableView;
    //页面控制器
    UIPageControl * _pageControl;
}

@end

@implementation WJJRootViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view.
    self.title = @"2";
    //模拟得到数据
    [self createDataSources];
    //创建tableView
    [self createTableView];
    //创建一个BarButton 用来编辑每个cell的
    [self createBarButtonItem];
}


//得到数据方法的实现 就是在数组中添加20个字符串对象
- (void)createDataSources{
    _dataArray = [[NSMutableArray alloc] init];
    for (int i = 0; i < 20; i++) {
        NSString * tempStr = [NSString stringWithFormat:@"第%d行",i];
        [_dataArray addObject:tempStr];
    }
}

//创建一个tableView
- (void)createTableView{
    
    /*
     UITableViewStylePlain    不分组的table
     UITableViewStyleGrouped  分组的tableView
     */
    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)
                                              style:UITableViewStylePlain];
    //在写完tableView后 一定要把下面这两句写上 代理和数据源都是self
    _tableView.delegate = self;
    _tableView.dataSource = self;
    [self.view addSubview:_tableView];
    
    
    //创建一个背景视图
    UIView * backgroudView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 150)];
    //创建一个滚动视图
    UIScrollView * scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 150)];
    //设置滚动视图的实际大小
    scrollView.contentSize = CGSizeMake(4 * 320, 150);
    //偏移量
    scrollView.contentOffset = CGPointZero;
    //是否分页
    scrollView.pagingEnabled = YES;
    //水平的滚动栏隐藏
    scrollView.showsHorizontalScrollIndicator = NO;
    //设置代理
    scrollView.delegate = self;
    //没有那种图片到头了的橡皮筋效果
    scrollView.bounces = NO;
    //加四张图片放到scrollView上面
    for (int i = 0; i < 4; i++) {
        UIImageView * imageV = [[UIImageView alloc] initWithFrame:CGRectMake(i * 320, 0, 320, 150)];
        [imageV setImage:[UIImage imageNamed:[NSString stringWithFormat:@"image%d.png",i]]];
        [scrollView addSubview:imageV];
    }
    
    //初始化页面控制器  总页数是4  初始页面是0
    _pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, 130, 320, 20)];
    _pageControl.numberOfPages = 4;
    _pageControl.currentPage = 0;
    
    //把滚动视图放到背景视图上
    [backgroudView addSubview:scrollView];
    //把分页控制器方到背景视图上
    [backgroudView addSubview:_pageControl];
    
    //然后把我们创建的背景视图方在tableView的头视图的位置
    _tableView.tableHeaderView = backgroudView;
    
}

<span style="color:#FF0000;">- (void)createBarButtonItem{
    
    //创建一个按钮 点击后使得tableView处于编辑状态
    UIButton * rightButton = [UIButton buttonWithType:UIButtonTypeSystem];
    rightButton.frame = CGRectMake(0, 0, 50, 30);
    [rightButton setTitle:@"edit" forState:UIControlStateNormal];
    [rightButton addTarget:self action:@selector(editTableView)
          forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem * rightBarButtonItem = [[UIBarButtonItem alloc]
                                            initWithCustomView:rightButton];
    self.navigationItem.rightBarButtonItem = rightBarButtonItem;
}

//使得tableView的编辑状态在相互切换
- (void)editTableView{
    _tableView.editing = !_tableView.editing;
}</span>


#pragma mark --UIScrollViewDelegate--
//实现scrollView的代理方法

//下面这个方法 是只要scrollView在动 始终会调用这个方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    
    //因为UITableView 是UIScrollView 的子类 所有判断我们是在点击哪个scrollView
    if (scrollView == _tableView) {
        //tableView的偏移量只是在y上面 所以当偏移量大于151时 让我们的导航栏慢慢消失
        if (scrollView.contentOffset.y > 151) {
            [UIView animateWithDuration:1 animations:^{
                self.navigationController.navigationBar.alpha = 0;
            }];
        }
        //当偏移量小于86时 让我们的导航栏再慢慢显示出来
        else if (scrollView.contentOffset.y < 86) {
            [UIView animateWithDuration:2 animations:^{
                //self.navigationController.navigationBarHidden = NO;
                self.navigationController.navigationBar.alpha = 1;
            }];
        }
    }
}


//这个是scrollView的代理方法中  最后一个执行的函数 停止减速的意思  在这里我们设置页面控制器和scrollView关联 当scrollView达到一定的偏移量 就是另一个页面 控制器也随之变化
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    //当我们点击的是tableView时 不做操作
    if (scrollView == _tableView) {
        
    }
    //当时scrollView时 我们通过计算改变pageControl的page值
    else{
        NSInteger page = scrollView.contentOffset.x / 320;
        _pageControl.currentPage = page;
    }
}


#pragma mark --UITableViewDeleagate
//此方法必须实现 返回的是一个分组内有多少行 因为我们就一个组 所以直接返回数据源数组的个数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    
    return _dataArray.count;
}
//此方法和上面这个方法一样 必须得实现 返回的是cell  重复使用cell的代理方法
- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    //首先 tableView会找带有标记@"snail"的闲置的cell
    UITableViewCell * tableViewCell = [tableView dequeueReusableCellWithIdentifier:@"snail"];
    //如果没有的话 就自动创建 并且把标记@"snail"写上
    if (!tableViewCell) {
        tableViewCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"snail"];
    }
    // indexPath 有两部分组成 一个是:某行indexPath.row 另一个是:某组indexPath.section
    //cell上面的textLabel上面加上我们数组对应的字符串
    tableViewCell.textLabel.text = _dataArray[indexPath.row];
    //给cell添加一个图片
    [tableViewCell.imageView setImage:[UIImage imageNamed:@"star_icon@2x.png"]];
    //这里给cell的详情标签上再添加文字
    tableViewCell.detailTextLabel.text = _dataArray[indexPath.row];
    return tableViewCell;
}

//返回的是tableViewCell的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 70;
}

//选中每个tableViewCell调用的方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    //点击cell后 不点击后使得cell处于未点击状态 并且有动画
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}


<span style="color:#FF0000;">#warning 关于操作cell的代理方法
//此方法是设置每个tableView是否可以被编辑 YES可以编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
    return YES;
}
//设置每个cell 如果被编辑 将会执行什么编辑
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    //当行数是偶数时  我们设此cell 如果执行操作 就是删除的操作
    if (indexPath.row % 2 == 0) {
        return UITableViewCellEditingStyleDelete;
    }else{
        //奇数时  插入的操作
        return UITableViewCellEditingStyleInsert ;
    }
}
//此方法 是根据上面为每个cell设置的操作形式 来进行真正的操作
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    
    //如果cell是删除的形式 那我们就删除此cell
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //首先 把数据源里面的数据移除
        [_dataArray removeObjectAtIndex:indexPath.row];
        //然后tableView在删除某行  动画可以很多种
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];
         }else if (editingStyle == UITableViewCellEditingStyleInsert){
             //如果是插入操作
             //记录下插入的位置
             NSInteger row = indexPath.row;
             //插入cell后将要再cell上显示的信息
             NSString * insertStr = @"添加行";
             //首先在数据源添加此数据
             [_dataArray insertObject:insertStr atIndex:row];
             //再在tableView上插入一行
             [tableView insertRowsAtIndexPaths:@[indexPath]
                              withRowAnimation:UITableViewRowAnimationRight];
         }
}

//设置每个cell往左移动时 显示的字符串
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{
    return @"删除";
}

#warning 关于cell移动的代理方法
//设置cell是否可以被移动
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{
    return YES;
}

//对cell进行移动 sourceIndexPath源cell位置   destinationIndexPath目的位置
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
    
    //记录下哪行cell要移动
    NSInteger fromRow = sourceIndexPath.row;
    //记录下cell将要被移动到哪行
    NSInteger toRow = destinationIndexPath.row;
    //把要移动那行的数据拿出来
    id obj = _dataArray[fromRow];
    //把要移动的那行对应在array中得数据删除
    [_dataArray removeObject:obj];
    //然后再移动的目标位置对应的array数据源添加上数据
    [_dataArray insertObject:obj atIndex:toRow];
    //然后让tableView重新载入数据
    [tableView reloadData];
    
}</span>

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

技术分享


技术分享


技术分享


技术分享

版权声明:本文为博主原创文章,未经博主允许不得转载。

Snail—UI学习之表视图TableView(二)

标签:

原文地址:http://blog.csdn.net/qq1791422018/article/details/47155937

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!