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




posted on 2017-05-22 14:54  yjbjingcha  阅读(1256)  评论(0编辑  收藏  举报

导航