zoukankan      html  css  js  c++  java
  • iOS开发-UITableView单选多选/复选实现1

    TableView怎样实现单选或者多选呢?

    我们的直接思路是改动某一个Cell的样式就可以,

    那么改动样式须要通过改动相应的数据,

    从这里能够判断我们须要给Cell相应的数据设置一个标志位,

    当选中的时候来改动该标志位刷新那一行就可以

    假设是单选实现略微复杂一些:

    单选须要设置一个属性来保存上一次选中的行,

    待选中新的行之后须要改动该行,不断维护


    我的实现例如以下:

    (1)创建一个TableViewController,

    为了简单使用系统的Cell样式

    设置重用标识符为 ACELL

    cell相应的Model类为Person,

    Person是Cell上相应的数据还包含是否选中的标志位

    (2)导航栏的左边button用来提交单选的结果,右边button用来跳转到复选的界面



    (3)关键代码


    Person数据类,为cell提供数据

    ifSelected属性的YES 或者 NO关乎是否该行cell被标记

    //
    //  Person.h
    //  app39-表视图8-单选复选
    //
    //  Created by MRBean on 15/7/24.
    //  Copyright (c) 2015年 yangbin. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    @interface Person : NSObject
    @property(copy,nonatomic)NSString *title;//cell上的textLabel数据
    @property(copy,nonatomic)NSString *detail;//cell上的detailLabel数据
    @property(assign,nonatomic)BOOL ifSelected;//是否选中
    @end
    

    TableViewController

    //
    //  TableViewController.m
    //  app39-表视图8-单选复选
    //
    //  Created by MRBean on 15/7/24.
    //  Copyright (c) 2015年 yangbin. All rights reserved.
    //
    
    #import "TableViewController.h"
    #import "Person.h"
    @interface TableViewController ()
    @property(strong,nonatomic)NSMutableArray *marr;//数据来源
    @property(strong,nonatomic)NSIndexPath *lastSelected;//上一次选中的额索引
    @end
    
    @implementation TableViewController
    


    //初始时产生假数据

    - (void)viewDidLoad {
        [super viewDidLoad];
        _marr = [[NSMutableArray alloc]init];
        for (int i=0; i<20; i++)//产生大量假数据,使用系统的Cell
        {
            Person *p = [[Person alloc]init];
            p.title = [NSString stringWithFormat:@"%iTitle",i];
            p.detail = [NSString stringWithFormat:@"%iDetail",i];
            p.ifSelected = NO;//是否被选中,默认都是NO
            [_marr addObject:p];
        }
    }
    

    #pragma mark - 数据源

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }
    

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return _marr.count;
    }
    


    //配置每个cell的显示

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ACELL" forIndexPath:indexPath];
        Person *p = _marr[indexPath.row];
        cell.textLabel.text = p.title;//cell上的title显示
        cell.detailTextLabel.text = p.detail;
    //下面为关键代码1
      if(p.ifSelected)//是否选中,假设为YES则标记
          cell.accessoryType = UITableViewCellAccessoryCheckmark;//勾标记
      else cell.accessoryType = UITableViewCellAccessoryNone;//不标记
        return cell;
    }
    


    //选中一行cell后改变数据

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSIndexPath *temp = self.lastSelected;//暂存上一次选中的行
        if(temp && temp!=indexPath)//假设上一次的选中的行存在,而且不是当前选中的这一样,则让上一行不选中
        {
            Person *tp = _marr[temp.row];
            tp.ifSelected = NO;//改动之前选中的cell的数据为不选中
            [tableView reloadRowsAtIndexPaths:@[temp] withRowAnimation:UITableViewRowAnimationAutomatic];//刷新该行
        }
        self.lastSelected = indexPath;//选中的改动为当前行
        Person *p = _marr[indexPath.row];
        p.ifSelected = YES;//改动这个被选中的一行choon
        [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];//又一次刷新这一行
    }

    //点击提交,打印选中的结果

    - (IBAction)tapSubmit:(UIBarButtonItem *)sender
    {
        Person *select = _marr[_lastSelected.row];
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"你选择的是:" message:select.title delegate:nil cancelButtonTitle:@"我知道了" otherButtonTitles:nil, nil];
        [alert show];
    }
    


    //收到内存警告

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

    @end


    执行效果:

    单选效果



    下一篇:TableView复选的实现http://blog.csdn.net/yangbingbinga/article/details/47057747

    相关文章:http://blog.csdn.net/yangbingbinga




  • 相关阅读:
    面试题32_3:之字形打印二叉树
    面试题21_2:调整数组顺序使奇数位于偶数之前(各数之间的相对位置不变)
    面试题21:调整数组顺序使奇数位于偶数前面
    面试题32_2:分行从上到下打印二叉树
    面试题32:从上到下打印二叉树
    面试题31:栈的压入、弹出序列
    面试题30:包含min函数的栈
    二分图的最大匹配
    链式前向星+次短路
    次小生成树
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6889465.html
Copyright © 2011-2022 走看看