Snail—UI学习之表视图TableView多行删除

这次实现的功能是多行cell进行删除

代码是在上一次的基础上进行修改的 有的代码删除重写 有的方法只是加了一些逻辑判断

//
//  WJJRootViewController.m
//  blog_UITableView
//
//  Created by Snail on 15-7-30.
//  Copyright (c) 2015年 Snail. All rights reserved.
//

#import "WJJRootViewController.h"

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

   <span style="background-color: rgb(204, 204, 204);"> //搜索Bar
    UISearchBar * _searchBar;
    //搜索控制器
    UISearchDisplayController * _searchDC;
    //存储搜索出来的数据
    NSMutableArray * _searchResultDataArray;

    //广告栏的滚动视图
    UIScrollView * _scrollView;</span>
}

@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];

    <span style="background-color: rgb(204, 204, 204);">[self createSearch];</span>
}

<span style="background-color: rgb(204, 204, 204);">- (void)createSearch{

    //开始实例化
    _searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
    //把搜索条加到导航栏上
    self.navigationItem.titleView = _searchBar;
    //第一个参数:searchBar  第二个参数:展示在哪个controller上
    _searchDC = [[UISearchDisplayController alloc] initWithSearchBar:_searchBar contentsController:self];

    _searchDC.searchResultsDelegate = self;
    _searchDC.searchResultsDataSource = self;
    //如果 搜索条加到导航栏上 下面这句代码必须执行
    _searchDC.displaysSearchBarInNavigationBar = YES;
}
</span>
//得到数据方法的实现 就是在数组中添加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)];
    //创建一个滚动视图
    _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];
    }
    UIImageView * lastImageView = [[UIImageView alloc] initWithFrame:CGRectMake(4 * 320, 0, 320, 150)];
    [lastImageView setImage:[UIImage imageNamed:@"image0.png"]];
    [_scrollView addSubview:lastImageView];
    [NSTimer scheduledTimerWithTimeInterval:3.1 target:self selector:@selector(scroll:) userInfo:nil repeats:YES];

    //初始化页面控制器  总页数是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="background-color: rgb(204, 204, 204);">//让上面的广告栏自动滑动
- (void)scroll:(NSTimer *)timer{

    CGPoint point = _scrollView.contentOffset;
    point.x += 320;
    [UIView animateWithDuration:1 animations:^{
        _scrollView.contentOffset = point;
    } completion:^(BOOL finished) {
        if (_scrollView.contentOffset.x > 3 * 320) {
            _scrollView.contentOffset = CGPointZero;
        }
        NSInteger page = _scrollView.contentOffset.x / 320;
        _pageControl.currentPage = page;
    }];
}</span>
- (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;

<span style="background-color: rgb(204, 204, 204);">    //删除按钮
   UIButton * leftButton = [UIButton buttonWithType:UIButtonTypeSystem];
    leftButton.frame = CGRectMake(0, 0, 50, 30);
    [leftButton setTitle:@"delete" forState:UIControlStateNormal];
    [leftButton addTarget:self action:@selector(deleteAllData)
          forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem * leftBarButtonItem = [[UIBarButtonItem alloc]
                                            initWithCustomView:leftButton];
    self.navigationItem.leftBarButtonItem = leftBarButtonItem;

}
</span>

#warning 关于多行删除的操作

<span style="background-color: rgb(204, 204, 204);">- (void)deleteAllData{

    //系统会把所选中的indexPath.row 装到一个数组里面
    NSMutableArray * array = [[NSMutableArray alloc]
                              initWithArray:[_tableView indexPathsForSelectedRows]];
    //对这个杂乱无序的数组 排序
    [array sortUsingSelector:@selector(compare:)];

    //遍历数组 把每个index取出来 然后再_dataArray里面对应的元素删除
    for (int i = array.count - 1; i >= 0;i--) {
        NSIndexPath * path = array[i];
        [_dataArray removeObjectAtIndex:path.row];
        NSLog(@"%d",path.row);
    }
    //重新加载数据
    [_tableView reloadData];
    //删除并且 有动画
    //[_tableView deleteRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationAutomatic];
}</span>

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

#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{
   <span style="background-color: rgb(204, 204, 204);"> //当我们点击的是tableView时 不做操作
    if (scrollView == _tableView) {

    }
    //当时scrollView时 我们通过计算改变pageControl的page值
    else{
        NSInteger page = scrollView.contentOffset.x / 320;
        _pageControl.currentPage = page;
    }</span>
}

#pragma mark --UITableViewDeleagate
//此方法必须实现 返回的是一个分组内有多少行 因为我们就一个组 所以直接返回数据源数组的个数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    //返回数据源元素的个数
    //如果是tableView  就返回数据源_dataArray的元素个数
    if (tableView == _tableView) {
        return _dataArray.count;
    }
   <span style="background-color: rgb(204, 204, 204);"> //如果是搜索的那个视图
    else{

        //如果数组不存在 就创建一个新的数组
        if (_searchResultDataArray == nil) {
            _searchResultDataArray = [[NSMutableArray alloc] init];
        }
        //如果存在 就清空数组
        else{
            [_searchResultDataArray removeAllObjects];
        }
        //得到搜索栏中得字符串_searchBar.text 然后再数据源_dataArray中的元素查找
        //然后找到与搜索栏中有关系的元素添加大搜索栏的数据数组中
        for (NSString * string in _dataArray) {
            NSRange range = [string rangeOfString:_searchBar.text];
            if (range.location != NSNotFound) {
                [_searchResultDataArray addObject:string];
            }
        }
        //返回搜索栏中数组的个数
        return _searchResultDataArray.count;
    }</span>

}
//此方法和上面这个方法一样 必须得实现 返回的是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"];
    }
    if (tableView == _tableView) {
        // indexPath 有两部分组成 一个是:某行indexPath.row 另一个是:某组indexPath.section
        //cell上面的textLabel上面加上我们数组对应的字符串  _dataArray
        tableViewCell.textLabel.text = _dataArray[indexPath.row];
        //这里给cell的详情标签上再添加文字
        tableViewCell.detailTextLabel.text = _dataArray[indexPath.row];
    }<span style="background-color: rgb(204, 204, 204);">else{
        //删除的cell上面的textLabel上面加上我们删除数组对应的字符串  _searchResultDataArray
        tableViewCell.textLabel.text = _searchResultDataArray[indexPath.row];
        //这里给cell的详情标签上再添加文字
        tableViewCell.detailTextLabel.text = _searchResultDataArray[indexPath.row];
    }</span>

    //给cell添加一个图片
    [tableViewCell.imageView setImage:[UIImage imageNamed:@"[email protected]"]];

    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="background-color: rgb(204, 204, 204);">//如果tableView正在在编辑 什么操作也不作
    if (tableView.editing == YES) {

    }else{
        //不是打开的 才可以点击行的操作
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
    </span>
}

#warning 关于操作cell的代理方法
//此方法是设置每个tableView是否可以被编辑 YES可以编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
    return YES;
}
<span style="background-color: rgb(204, 204, 204);">//设置每个cell 如果被编辑 将会执行什么编辑
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{

    //返回cell的多选样式
    return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert;

    /* 删除一个
    //当行数是偶数时  我们设此cell 如果执行操作 就是删除的操作
    if (indexPath.row % 2 == 0) {
        return UITableViewCellEditingStyleDelete;
    }else{
        //奇数时  插入的操作
        return UITableViewCellEditingStyleInsert ;
    }
     */
}</span>
//此方法 是根据上面为每个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];

}

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

@end

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

时间: 2024-10-05 23:58:13

Snail—UI学习之表视图TableView多行删除的相关文章

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

我们是整一个表视图 然后再表视图的上方是一个广告栏 首先,在.h文件中写上下面的代码 主要就是遵守一些代理 #import <UIKit/UIKit.h> @interface WJJRootViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,UIScrollViewDelegate> @end 然后再.m文件中写上如下 #import "WJJRootViewContro

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

接着上面的项目 ,当下面标记红色的代码写上后,我们按下右上角的edit按钮 就可以对cell进行插入.删除.移动等操作 #import "WJJRootViewController.h" @interface WJJRootViewController (){ //数据源 存放数据 NSMutableArray * _dataArray; //这就是我们的tableView UITableView * _tableView; //页面控制器 UIPageControl * _pageC

Snail—UI学习之导航视图控制器UINavigationController(系统)

背景 有一个根视图控制器 然后跳转到第一个界面  第一个界面可以返回到根视图 也可以跳转到第二个视图 第二个视图可以直接返回到根视图 新建三个ViewController    RootViewController FirstViewController SecondViewController 首先在AppDelegate.m中写入 #import "WJJAppDelegate.h" #import "WJJRootViewController.h" @impl

iOS开发学习之#表视图#(1)删除行

好久木有写博客了,前面学习的表视图其他内容都木有写,今天就从删除行开始吧,希望自己能够坚持下去..加油(^ω^)..废话少说吧,,,直接上代码: 下面是删除行的核心代码: - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{ if (editingStyle

iOS开发学习之#表视图#(2)添加行

继续上篇学到的删除行,有删除就有添加:添加行我们用 - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 其中(NSArray *)indexPaths用于识别表视图中得行,(UITableViewRowAnimation)animation用来指定动画 核心代码如下: //设置表单元的编辑风格 - (UITableViewCellEditi

UI开发----UITableView表视图-1

//  Created By 郭仔   2015年04月22日22:12:47 // ================================== 时间都去哪了!!!!!!! // ================================== 表视图 UITableView,iOS中最重要的视图,随处可?见. 表视图通常?用来管理?一组具有相同数据结构的数据. UITableView继承?自UIScrollView,所以可以滚动 表视图的每?一条数据都是显?示在UITableVi

IOS学习之——表视图 给tableViewController添加悬浮窗口

前言 在IOS中,UITableViewController不如UIViewController用的方便,遇到了一个需求:在TableView中添加一个悬浮按钮,不随TableView滑动而滑动.这个需求在UIViewController里面很好实现,给self.view 添加子视图,再把子视图放到最上方即可.可是在表视图控制器中,就很难办,因为控制器中没有作为tableView的父视图的view存在,而把button作为tableView的子视图出现呢,则会随着table的滑动而滑动(⊙﹏⊙b

iOS开发学习之#表视图#(3)移动行

继续上篇接下来介绍移动行:移动行我们用 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath (UITableView *)tableView用来指定表视图,(NSIndexPath *)sourceIndexPath用来指定要移动行的索引路径,(NSIndexPath

iOS开发学习之#表视图#(4)填充Grouped风格的分组表

直接上代买吧: @implementation ViewController - (void)viewDidLoad { a = [NSArray arrayWithObjects:@"ant",@"alpaca",@"albatross", nil]; b = [NSArray arrayWithObjects:@"badger",@"bat",@"bear", nil]; c = [