好久没更新博客了,今天写了一个自定义的多选列表,可以跟爱学习的各位进行分享,首先我们先来看一下效果图:

一般大家都是用UITableView自己的编辑模式来实现CheckBox的,这里我们用自定义Cell和两张图片来实现,一张是未选中,一张是选中的图片

好了,我们首先来看一下代码:首先在Cell中定义了三个控件,两个UILabel和一个UIImageView

  1. #import <UIKit/UIKit.h>
  2. @interface MultiChoceCell : UITableViewCell
  3. @property (strong, nonatomic) IBOutlet UILabel *nameLabel;
  4. @property (strong, nonatomic) IBOutlet UILabel *departLable;
  5. @property (strong, nonatomic) IBOutlet UIImageView *checkBox;
  6. @end

好了,这个相信各位学过UITableViewCell的同学都应该知道,接下来,我们就来写最主要的ViewController了

在头文件.h文件里,我们首先定义了一个协议专门用来做回调的,还定义了一个选项数组和选中的数组,还有一个UITableView,我个人喜欢在ViewController里套上UITableView,因为可以改变TableView的大小。

  1. #import <UIKit/UIKit.h>
  2. @class MultiChoceViewController;
  3. @protocol MultiChoceDelegate <NSObject>
  4. @required
  5. -(void)MultiChoceSelectArray:(NSArray *)array ViewController:(MultiChoceViewController *)controller;
  6. @end
  7. @interface MultiChoceViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>
  8. @property(nonatomic, strong)NSArray *itemArray;
  9. @property(nonatomic, strong)NSMutableArray *selectArray;
  10. @property (strong, nonatomic) IBOutlet UITableView *mTableView;
  11. @property (nonatomic, strong) id<MultiChoceDelegate> delegate;
  12. - (IBAction)backAction:(id)sender;
  13. - (IBAction)okAction:(id)sender;
  14. @end

接下来,我们看一下实现方式,在ViewDidLoad中将UITableView的颜色去掉,然后就是定义UITableViewDataSource和UITableViewDelegate了,看一下代码吧:

  1. #import "MultiChoceViewController.h"
  2. #import "MultiChoceCell.h"
  3. @interface MultiChoceViewController ()
  4. @end
  5. @implementation MultiChoceViewController
  6. - (void)viewDidLoad
  7. {
  8. [super viewDidLoad];
  9. [_mTableView setBackgroundColor:[UIColor clearColor]];
  10. // Do any additional setup after loading the view from its nib.
  11. }
  12. - (void)didReceiveMemoryWarning
  13. {
  14. [super didReceiveMemoryWarning];
  15. // Dispose of any resources that can be recreated.
  16. }
  17. #pragma mark UITableViewDataSource
  18. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
  19. return [_itemArray count];
  20. }
  21. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  22. static NSString *identifier = @"itemCell";
  23. MultiChoceCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
  24. if (cell == nil) {
  25. NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"MultiChoceCell" owner:self options:nil];
  26. cell = [array objectAtIndex:0];
  27. }
  28. NSDictionary *dict = [_itemArray objectAtIndex:indexPath.row];
  29. cell.nameLabel.text = [dict objectForKey:@"UserName"];
  30. cell.departLable.text = [dict objectForKey:@"DepartMent"];
  31. if ([_selectArray containsObject:dict]) {
  32. cell.checkBox.image = [UIImage imageNamed:@"checked.png"];
  33. }
  34. return cell;
  35. }
  36. - (IBAction)backAction:(id)sender {
  37. [self.navigationController popViewControllerAnimated:YES];
  38. }
  39. - (IBAction)okAction:(id)sender {
  40. [_delegate MultiChoceSelectArray:_selectArray ViewController:self];
  41. }
  42. #pragma mark UITableViewDelegate
  43. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
  44. NSDictionary *selectDict = [_itemArray objectAtIndex:indexPath.row];
  1. //判断数据是否在选择列表中
  2. if ([_selectArray containsObject:selectDict]) {
  3. [_selectArray removeObject:selectDict];
  4. }else{
  5. [_selectArray addObject:selectDict];
  6. }
  7. [_mTableView reloadData];
  8. }
  9. @end

这里没什么特别的,只是在didSelectRowAtIndexPath中写了一句判断语句

在调用的页面,我们把itemArray和selectArray传入

  1. MultiChoceViewController *controlller = [[MultiChoceViewController alloc] initWithNibName:@"MultiChoceViewController" bundle:nil];
  2. controlller.delegate = self;
  3. controlller.itemArray = userArray;
  4. controlller.selectArray = selectArray;
  5. [self.navigationController pushViewController:controlller animated:YES];

并实现多选方法中中协议来关掉当前页面,并将选中的数据传出

  1. #pragma mark MultiChoceDelegate
  2. -(void)MultiChoceSelectArray:(NSMutableArray *)array ViewController:(MultiChoceViewController *)controller{
  3. selectArray = array;
  4. [self.navigationController popViewControllerAnimated:YES];
  5. }

这里有很重要的一点就是委托方法的应用,如果前面一个页面需要后面页面的数据,就要想到用委托来实现回调,其实只要掌握了委托一些页面间的传值也就不难了,这篇文章只是给大家做个介绍,但如何做出自己想要的效果还是需要多多练习和学习的。谢谢

iPhone实现自定义多选列表的更多相关文章

  1. WPF自定义控件与样式(8)-ComboBox与自定义多选控件MultComboBox

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 下拉选 ...

  2. c# 自定义多选下拉列表2

    以下为工作中遇到的,备注一下 先需要几个辅助类 #region GripBounds using System.Drawing; internal struct GripBounds { ; ; pu ...

  3. 【转】WPF自定义控件与样式(8)-ComboBox与自定义多选控件MultComboBox

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等. 本文主要内容: 下拉选择控件ComboBox的自定义样式及扩展: 自定义多选控件Mul ...

  4. WPF 自定义ComboBox样式,自定义多选控件

    原文:WPF 自定义ComboBox样式,自定义多选控件 一.ComboBox基本样式 ComboBox有两种状态,可编辑和不可编辑状态.通过设置IsEditable属性可以切换控件状态. 先看基本样 ...

  5. MVC应用程序与多选列表(checkbox list)

    原文:MVC应用程序与多选列表(checkbox list) 程序中,经常会使用checkbox lsit来呈现数.能让用户有多选项目.此博文Insus.NET练习的checkbox list相关各个 ...

  6. multiselect2side:jQuery多选列表框插件

    http://blog.csdn.net/rosanu_blog/article/details/8550723 http://www.bkjia.com/jQuery/449193.html < ...

  7. 自定义SWT控件二之自定义多选下拉框

    2.自定义下拉多选框 package com.view.control.select; import java.util.ArrayList; import java.util.HashMap; im ...

  8. Vue.js 多选列表(Multi-Select)组件

    搬运公众号早前文章 多选列表 (Multi-Select) 是一种将所有选项列出,并允许用户利用 Ctrl/Shift 键进行多选的 UI 元素.这是一种常见的设计元素.有时候为了节省空间,我们会将选 ...

  9. sharepoint 2010自定义访问日志列表设置移动终端否和客户端访问系统等计算列的公式

    上个月本人开发和上线了一个在SharePoint 2010上基于HTML5的移动OA网站,后端服务采用自定义的基于AgilePoint工作流引擎的Sharepoint Web服务,前端主要采用Jque ...

随机推荐

  1. 在ubuntu上部署一个samba服务器

    今天公司装了一天新电脑,准备把它装成服务器,于是为了方便开发的使用,我在上面部署了一个samba,用来实现window和linux的联系: 具体步骤,我详细的查看了百度,高手云集,以下就是总结了网友的 ...

  2. 剑指Offer——算法复杂度中的O(logN)底数是多少

    剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...

  3. 【Unity Shaders】使用Unity Render Textures实现画面特效——建立画面特效脚本系统

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  4. Dubbo粗浅记录

    这篇博客只是我自己的学习记录,对各位高手怕是没有什么太大的帮助,望高手不吝赐教. 项目的截图如下: 我们使用的主要就是红框里面的. 这里我主要分析两个xml /DubboTest/src/main/r ...

  5. Java学习从菜鸟变大鸟之一 hashCode()和equals()的本质区别和联系

    在学习java,根据视频做实例的过程中,对equals和hashcode两个方法理解稍微深刻一点,主要是它们两个很容易混淆,容易出错,自己又通过网上的资料学习,和大家分享 equals()方法 equ ...

  6. (NO.00003)iOS游戏简单的机器人投射游戏成形记(二十)

    接上一篇文章,我们现在来实现篮框的感应器. 所谓感应器,就是在物体接触到的时候做出反应的节点.我们需要将感应器放在篮框底部,这样子弹接触感应器的时候,我们就知道子弹坠入了篮框,从而得分. 为了放置子弹 ...

  7. C语言之free函数及野指针

    [FROM MSDN && 百科] 原型:  void free(void *ptr); #include<stdlib.h>或#include <malloc.h& ...

  8. ZooKeeper实现分布式锁

    使用场景          一般的锁是指单进程多线程的锁,在多线程并发编程中,用于线程之间的数据同步,保证共享资源的访问.而分布式锁,指的是在分布式环境下,保证跨进程.跨主机.跨网络的共享资源,实现互 ...

  9. ant+eclipse知识点详解及使用案例

    ant的优点和地位就不再阐述,下面直接上知识点: 在java中使用xml文件开发,有以下基本语法 (1)project:每个ant程序有且只有一个此标签,而且是类似于html的总标签,有name,de ...

  10. matlab下K-means Cluster 算法实现

    一.概念介绍 K-means算法是硬聚类算法,是典型的局域原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则.K-means算法以欧 ...