UITableView知识梳理须知—(一)

1、UITableView掌握

      1>  设置UITableView的dataSource、delegate 

      2>    UITableView多组数据和单组数据的展示 

      3>  UITableViewCell的常见属性 

      4>    UITableView的性能优化(cell的循环利用)

      5>  自定义Cell

2、什么是UITableView

    在iOS中,要实现展示列表数据,最常用的做法就是使用UITableView。UITableView继承自UIScrollView,因此支持垂直滚动,而且性能极佳

3、如何展示数据  

  1.  UITableView需要一个数据源(dataSource)来显示数据

  2. UITableView会向数据源查询一共有多少行数据以及每一行显示什么数据等

  3. 没有设置数据源的UITableView只是个空壳

  4. 凡是遵守UITableViewDataSource协议的OC对象,都可以是UITableView的数据源

4、UITableViewCell

4.1  UITableViewCell简介:

 UITableView的每一行都是一个UITableViewCell,通过dataSource的tableView:cellForRowAtIndexPath:方法来初始化每一行

 UITableViewCell内部有个默认的子视图:contentView,contentView是UITableViewCell所显示内容的父视图,可显示一些辅助指示视图

辅助指示视图的作用是显示一个表示动作的图标,可以通过设置UITableViewCell的accessoryType来显示,默认是UITableViewCellAccessoryNone(不显示辅助指示视图),其他值如下:
UITableViewCellAccessoryDisclosureIndicator
UITableViewCellAccessoryDetailButton
UITableViewCellAccessoryDetailDisclosureButton
UITableViewCellAccessoryCheckmark
还可以通过cell的accessoryView属性来自定义辅助指示视图(比如往右边放一个开关),cell的属性accessoryView的优先级高于属性accessoryType

4.2 UITableViewCell的contentView

   contentView下默认有3个子视图

1、其中2个是UILabel(通过UITableViewCell的textLabeldetailTextLabel属性访问)
2、第3个是UIImageView(通过UITableViewCell的imageView属性访问)
3、UITableViewCell还有一个UITableViewCellStyle属性,用于决定使用contentView的哪些子视图,以及这些子视图在contentView中的位置     

4.3 UITableViewCell结构

4.4 UITableViewCell的重用原理

iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS设备的内存。要解决该问题,需要重用UITableViewCell对象     
     Cell重用原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象
    
还有一个非常重要的问题:有时候需要自定义UITableViewCell(用一个子类继承UITableViewCell),而且每一行用的不一定是同一种UITableViewCell,所以一个UITableView可能拥有不同类型的UITableViewCell,对象池中也会有很多不同类型的UITableViewCell,那么UITableView在重用UITableViewCell时可能会得到错误类型的UITableViewCell
解决方案:UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell对象

4.5 Cell的重用代码

 1 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 2 {
 3     // 1.定义一个cell的标识
 4       static NSString *ID = @”czcell";
 5     
 6     // 2.从缓存池中取出cell
 7       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
 8     
 9     // 3.如果缓存池中没有cell
10       if (cell == nil) {
11         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
12     }

5、UITableView、UITableViewController、代理与数据源之间的关系,如下图所属:

6、UITableView和数据源

 

1. tableView展示数据

    // 1.调用数据源的下面方法得知一共有多少组数据

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;

  // 2.调用数据源的下面方法得知每一组有多少行数据

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

   // 3.调用数据源的下面方法得知每一行显示什么内容

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

7、UITableView的常见属性

   1. 常用属性

    //1. 修改tableView的行高

self.tableView.rowHeight = 100;

 // 2.组头组尾的高

 self.tableView.sectionHeaderHeight = 55;self.tableView.sectionFooterHeight = 22;

 // 3.设置整个tablView的头部/尾部视图

  self.tableView.tableHeaderView = [[UISwitch alloc] init];self.tableView.tableFooterView = [UIButton buttonWithType:UIButtonTypeInfoDark];

 // 4.设置我们分割线颜色(clearColor相当于取消系统分割线)

self.tableView.separatorColor = [UIColor clearColor];

 // 5.设置分割线样式

 self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

// 设置索引条内部文字颜色

self.tableView.sectionIndexColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];

// 设置索引条背景颜色

self.tableView.sectionIndexBackgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];

// 允许UITableView多选

self.tableView.allowsMultipleSelection = YES; 

 

 

// 获取选中多行

NSArray *array = self.tableView.indexPathsForSelectedRows; 

 // 获取选中单行

NSIndexPath *indexPath = self.tableView.indexPathForSelectedRow;

 // 让UITableView进入编辑状态,会出现左滑效果(结合代理方法commitEditingStyle...处理左滑效果时编辑事件处理)

self.tableView.editing = YES;

   2、常见方法(数据源与代理方法)

#pragma mark - 数据源方法
// 返回行数
- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
}
// 设置cell - (UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath{ 。。。。。。。。。。。 }#pragma mark - 代理方法 /** * 设置行高 */ - (CGFloat)tableView:(nonnull UITableView *)tableView heightForRowAtIndexPath:(nonnull NSIndexPath *)indexPath{return 100; }// 添加每组的组头 - (UIView *)tableView:(nonnull UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
}// 返回每组的组尾 - (UIView *)tableView:(nonnull UITableView *)tableView viewForFooterInSection:(NSInteger)section{}// 选中某行cell时会调用 - (void)tableView:(nonnull UITableView *)tableView didSelectRowAtIndexPath:(nonnull NSIndexPath *)indexPath{NSLog(@"选中didSelectRowAtIndexPath row = %ld", indexPath.row); }/* 2015-07-21 10:01:56.261 02-UITableView单组数据展示[1305:36752] 选中didSelectRowAtIndexPath row = 0 2015-07-21 10:01:58.212 02-UITableView单组数据展示[1305:36752] 取消选中 didDeselectRowAtIndexPath row = 0 2015-07-21 10:01:58.212 02-UITableView单组数据展示[1305:36752] 选中didSelectRowAtIndexPath row = 1 */ // 取消选中某行cell会调用 (当我选中第0行的时候,如果现在要改为选中第1行 - 》会先取消选中第0行,然后调用选中第1行的操作) - (void)tableView:(nonnull UITableView *)tableView didDeselectRowAtIndexPath:(nonnull NSIndexPath *)indexPath{NSLog(@"取消选中 didDeselectRowAtIndexPath row = %ld ", indexPath.row); }// 设置UITableView的索引条方法: // 设置UITableView的索引条,返回数组字符串集合 - (nullable NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView;{NSArray *carGroupModels = self.carGroups;// 利用KVC获取指定属性的集合NSArray *array = [carGroupModels valueForKeyPath:@"title"];return array; }
索引条颜色与背景设置:
 // 设置索引条内部文字颜色self.tableView.sectionIndexColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];// 设置索引条背景颜色self.tableView.sectionIndexBackgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];

3、数据刷新

注意:
  * 添加刷新:使用UITableView的 insertRowsAtIndexPaths...方法
  * 修改刷新:使用UITableView的 reloadRowsAtIndexPaths...方法(该方法使用的前提是模型数据的个数不变,所以添加与删除不能采用此方法进行UITableView刷新功能。)
  * 删除刷新:使用UITableView的 deleteRowsAtIndexPaths...方法

谢谢自己的坚持 ,而没有懈怠,今天就到处结束,明天我讲系统的梳理自定义等高与不等高UITableViewCell,分别用frame、xib、storyboard、Autolayout实现,也将在其中使用第三方框架:Masonry与MJExtension,以便大家互相学习。睡觉了,晚安,^_^

转载于:https://www.cnblogs.com/cjpBlog/p/4669126.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Yarn中的几种状态机

1 概述 为了增大并发性&#xff0c;Yarn采用事件驱动的并发模型&#xff0c;将各种处理逻辑抽象成事件和调度器&#xff0c;将事件的处理过程用状态机表示。什么是状态机&#xff1f; 如果一个对象&#xff0c;其构成为若干个状态&#xff0c;以及触发这些状态发生相互转移的事…

分支管理(转载)

转自&#xff1a;http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743862006503a1c5bf5a783434581661a3cc2084efa000 分支就是科幻电影里面的平行宇宙&#xff0c;当你正在电脑前努力学习Git的时候&#xff0c;另一个你正在另一个平行…

分享一个用安卓手机就能引导pc安装linux系统办法

1、首先安卓手机下载软件DriveDroid.apk http://pan.baidu.com/s/1qW4pbT6 2、下载linux镜像文件放手机存储卡存储&#xff0c;放到Download/images/以下 3、打开软件会自己主动读取这个目录以下镜像&#xff0c;也能够在软件里面下载须要的镜像文件 4、软件设置usb连接模式 5、…

SharePoint 2013 开发——其他社交功能

博客地址&#xff1a;http://blog.csdn.net/FoxDave上一篇讲了如何获取用户配置文件的相关属性&#xff0c;它属于SharePoint 2013社交功能的一个小的构成部分。社交功能是SharePoint 2013改进的一大亮点。可以在现有网站上开启社交功能或者新建一个专门用于社交用途的社区网站…

第一个Qt+opencv程序

简单安装好Qt和编译安装好opencv后&#xff0c;简单实现第一个Qtopencv程序&#xff1a;读取并显示一张图片&#xff0c;这里我的Qt版本时5.9.1&#xff0c;opencv版本是4.0.1&#xff0c;版本的影响不大。 首先我们用Qt创建一个控制台项目&#xff0c;即在创建项目时选择Qt C…

redis学习笔记——应用场景

最近在看redis入门指南&#xff0c;现在就自己的学习情况说说自己的理解。 字符串类型&#xff08;String&#xff09; 字符串类型是Redis中最基本的类型&#xff0c;能存储任意形式的字符串&#xff0c;包括二进制数据。如一张照片也可以用字符串类型存储。注意字符串类型键允…

Graphviz从入门到不精通

1、安装Graphviz &#xff08;windows 版本&#xff0c;后面说linux下的安装&#xff09; 1.1&#xff09;下载安装文件 从graphviz官网下载 http://www.graphviz.org/Download.php 或者从我的百度网盘下载 http://pan.baidu.com/s/1i3mzunV 下载后双击安装&#xff0c;跟着提示…

HDU2602 (0-1背包)

Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 39259 Accepted Submission(s): 16261 Problem DescriptionMany years ago , in Teddy’s hometown there was a man who was called “Bone Col…

博客3万访问量了……

博客有3万访问量了呢。自从第一次用了赠送的1500的流量券&#xff0c;粉丝了从零突破了&#xff0c;到现在有150个粉丝了。 之前预想的写博客的初衷&#xff0c;也是记录自己的学习过程&#xff0c;毕竟好记忆不如烂笔头&#xff0c;记录下来就是长长久久的&#xff0c;随时可以…

循环多少次?

循环多少次&#xff1f; Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 17 Accepted Submission(s) : 12 Problem Description我们知道&#xff0c;在编程中&#xff0c;我们时常需要考虑到时间复杂度&#xff0…

【Java】Java里String 的equals和==

Java里面有对象和对象的引用的概念&#xff0c;在String方面&#xff0c;比较的是引用&#xff0c;equals比较的是对象的具体值。 String s1 new String("abc");String s2 new String("abc");System.out.println(s1 s2);System.out.println(s1.equals(s…

[bootstrap] 打造一个简单的系统模板(1) 左侧折叠菜单

1. 前言 最近需要做一个后台管理系统&#xff0c;我打算使用bootstrap弄一个好看的后台模板。网上的好多模板我觉的css和js有点重。 于是就打算完全依靠bootstrap搭建一个属于自己的模板。 首先从左侧的折叠菜单开始。看图。 2. CSS 代码 以下是自定义的css代码&#xff0c;由于…

How Many Shortest Path

zoj2760:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode2760 题意&#xff1a;给你一张有向带权图&#xff0c;然后问你最短路径有多少条。 题解&#xff1a;这一题用到了网络流&#xff0c;一开始&#xff0c;我想到用找到一条最短路&#xff0c;然后删除这条…

人物角色群体攻击判定二(叉乘来判断敌人的位置)

建议阅读: 判断敌人在玩家的某一个区域: http://www.cnblogs.com/plateFace/p/4716799.html 我们可以根据玩家和敌人的坐标, 进行叉乘来获取一个向量可以用它来判断敌人的位置, 敌人是否在攻击范围内. 下面我简单实现下对单体敌人是否攻击做判定 这种方式有一种重大的BUG, 假设…

HDU 5371 Manacher Hotaru's problem

求出一个连续子序列&#xff0c;这个子序列由三部分ABC构成&#xff0c;其中AB是回文串&#xff0c;A和C相同&#xff0c;也就是BC也是回文串。 求这样一个最长的子序列。 Manacher算法是在所有两个相邻数字之间插入一个特殊的数字&#xff0c;比如-1&#xff0c; Manacher算法…

平庸技术流,用 WebApi +AngularJS 实现网络爬虫

最近园子里网络爬虫很火爆&#xff0c;从 PHP 到 Python&#xff0c;从 windows服务 到 winform 程序&#xff0c;各路大神各显神通。小弟也献下丑&#xff0c;从平庸流出发&#xff0c;简述下 WebApi AngularJS 方式实现网络爬虫。 一、技术框架 1.1 前端&#xff1a; Angular…

python2.7虚拟环境virtualenv安装及使用

一 、虚拟环境virtualenv安装 1. 安装virtualenv 将Python的目录添加到系统环境变量后&#xff0c;在命令行输入&#xff1a; pip install virtualenv C:\Users\heroicai\Desktop>pip install virtualenv2. 建立虚拟环境 在桌面上建立建立一个虚拟环境myenv,输入:virtualenv…

Io 异常: The Network Adapter could not establish the connection

Io 异常: The Network Adapter could not establish the connection 这个异常的出现一般与数据库和你的PC的设置有关 这种异常的出现大致上有下面几种&#xff1a; 1。IP错误。 在设置URL时错误&#xff0c;例如&#xff1a;jdbc:oracle:thin:192.168.0.36:1521:sharp 数据库服…

iOS 9之WatchKit for WatchOS 2

金田&#xff08;github示例源码&#xff09; 自AppleWatch发行的同时就可以为AppWatch开发相应的应用程序&#xff0c;不过最初的版本&#xff0c;能开发的功能极为有限&#xff0c;所以也只是有少数的App厂商为Apple定制了App&#xff0c;所以迄今为止&#xff0c;Apple Stor…

创建响应式布局的10款优秀网格工具集锦

在这篇文章中&#xff0c;我们为您呈现了一组优秀的网格工具清单。如果我们错过了任何没有列出在这个清单上的东西&#xff0c;请分享给我们。如果网页设计和开人员采用了正确的工具集&#xff0c;并基于一个灵活的网格架构&#xff0c;以及能够把响应图像应用到到设计之中&…