我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用UITableView

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用UITableView

这篇文章主要讲解了“如何使用UITableView”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用UITableView”吧!

痛点

在我们iOS开发中UITableView几乎是所有App都会使用的一个UI控件,因为业务的需要,我们常常会注册多种Cell,然后在

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

中就会很自然的写出一堆类似这样的代码:

如何使用UITableView

事件处理的代码大概是这样的:

如何使用UITableView

这似乎没有什么问题,代码很干净,逻辑也比较清晰。

但是你维护几个版本之后,或者遇到了一个善变的产品经理。

你会发现,这样的代码维护起来真的很危险,稍微一不注意就出错了,这里用的type作为判断条件可能相较与indexPath要好一点。

如果使用indexPath作为判断条件,如果你的cell顺序有变化,或者有改动,那么你可能至少需要维护以下几个地方:

  1. 你的模型数组

  2. cell dequeue的判断条件

  3. 事件处理的判断条件

  4. 。。。。

维护的东西越多,意味着你出错的概率是越大的。

那有没有什么好的方法处理这类代码?

分析

其实我们仔细想想,无论一个多么复杂的UITableView,与之对应的其实只要一个模型数组。

那么我们如果维护好了模型数组,是不是就维护好了UITableView中所有的cell,这是显而易见的。

如果我们的UITableView中有N种cell样式,那么模型数组中肯定也会有N种模型。

也就是说每种cell与每种模型是一一配对的,常规的模型与cell绑定是如上述的思路。

上述的思路,显然不是我们想要的,维护起来太不便,而且耦合性也比较大。

想一想展示一个UITableView的过程

  1. 发起网络请求

  2. JSON to Model,构造模型数组

  3. 数据填充

大致就是这三步吧。

其实在第二步构造模型数组时,我们是不是就可以确定好UI的样式了?

如果这里想不明白,再看看我们上面的分析,一种cell样式对应着一种模型,那么我们知道了模型,是不是就知道了cell样式

如果你还是不大清楚,那们就进入实战部分

实战

如何使用UITableView

先看这样一个简单的页面,你肯定会说:朋友,你TM在逗我们,这和UITableView有毛关系?

这个界面需要UITableView

没错,这个界面在UIViewController中直接构建就可以了。

请再看下面

如何使用UITableView

如何使用UITableView

是不是感觉都很类似,但是又有很多不同的地方。

方案

  1. 一个一个VC的写。

缺点:

有很多重复代码,而且后期的改动需要维护的地方,做不到高内聚。

  1. 抽象一个父类

    缺点:

    虽然三个VC看似UI上有很多共同之处,但是其中的业务处理完全不同的

  2. 抽象一个UIHelper用于构建UI

    缺点:

    这种方案看似很好了,但是你看如果在一个界面中,如果添加一个或者减少一个控件,又得重新做约束了,这也显然不是我们想要的。

下面看看通过UITableView构建的UI

展示

如何使用UITableView

SignInVC 中的代码:

如何使用UITableView

如何使用UITableView

PasswordSignVC 中的代码:

如何使用UITableView

再看cell的dequeue代码

如何使用UITableView

数据的绑定,全部分散到了每个cell中。

Row.h的代码

#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGIN@protocol Updatable <NSObject>@optional- (void)updateViewData:(id)viewData;@end@interface Row : NSObject@property(nonatomic, copy, readonly) NSString *reuseIdentifier;@property(nonatomic, strong, readonly) Class cellClass;@property(nonatomic, strong, readonly) id model;- (instancetype)initWithClass:(Class)cls model:(id)model;- (instancetype)initWithClass:(Class)cls;- (void)updateCell:(UITableViewCell *)cell;@endNS_ASSUME_NONNULL_END

Row.m的代码

@interface Row()@property(nonatomic, strong, readwrite) Class cellClass;@property(nonatomic, strong, readwrite) id model;@end@implementation Row- (instancetype)initWithClass:(Class)cls {    if (self = [self initWithClass:cls model:@""]) {    }    return self;}- (instancetype)initWithClass:(Class)cls model:(id)model {    if (self = [super init]) {        self.cellClass = cls;        self.model = model;    }    return self;}- (void)updateCell:(UITableViewCell *)cell {    if ([cell respondsToSelector:@selector(updateViewData:)]) {        [cell performSelector:@selector(updateViewData:) withObject:self.model];    }}- (NSString *)reuseIdentifier {    return [NSString stringWithFormat:@"%@", self.cellClass];}@end

整个Row的代码不过100行,把所有的处理都内聚在了一起,我们只要维护好模型数组就能很好的管理UITableView

UI是构建完成了,但是我相信其中有两个问题你肯定比较关心
  1. Cell 高度计算

  2. Cell上事件的回调

Cell 高度计算

在iOS8之后UITableView中推出了Self-sizing的功能,所以Cell的高度改变

        UIView *dummyView = [[UIView alloc] init];        dummyView.translatesAutoresizingMaskIntoConstraints = NO;        [self.contentView insertSubview:dummyView belowSubview:self.textField];        [dummyView.topAnchor constraintEqualToAnchor:self.contentView.topAnchor].active = YES;        [dummyView.bottomAnchor constraintEqualToAnchor:self.contentView.bottomAnchor].active = YES;        NSLayoutConstraint *constraint = [dummyView.heightAnchor constraintEqualToConstant:60];        constraint.priority = 999;        constraint.active = YES;

如果你对这块不熟悉,请跳转。如果你想对Auto Layout有一个提高建议看看Auto Layout Guide, 如果你想知道systemLayoutSizeFittingSize的作用,请看 深入理解Auto Layout 第一弹

Cell上事件的回调

有人肯定会不屑这里,但是我想说:如果不用block、代理、观察者。

怎么把cell上button的事件回调到VC中(button没有暴露给外部)?

我们先看添加Action的方法

- (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;

这里需要这三个参数:

  • target(action的相应者)

  • action(点击按钮相应的方法)

  • controlEvents(这个一般为UIControlEventTouchUpInside)

只要我们找到了target,把action写到target里这个action绑定是不是就完成了。

target其实就是我们的VC,我们只要把VC传递给Cell即可,但是这样是不是Cell又和VC耦合了啊。这个用block,delegate没什么区别吧!

现在我们需要解决的问题就是找到Cell的VC,大功即可告成。

这是就需要一个重要的概念闪亮登场iOS响应链(Responder Chain)

这里就不展开了,但是你一定要去了解这个。

响应链可以解决的问题:

  • 扩大相应区域

  • 超出父类视图相应依然可以传递

  • 垮图层传递事件

找到UIViewUIViewController

- (UIViewController *)viewController {    UIResponder *responder = self;    while (![responder isKindOfClass:[UIViewController class]]) {        responder = [responder nextResponder];        if (nil == responder) {            break;        }    }    return (UIViewController *)responder;}

ButtonCell事件绑定代码:

如何使用UITableView

这里我们还是要用一个协议的:

如何使用UITableView

注意

用这个协议主要是方便代码的阅读,而且在Swift中是必须使用协议的,因为编译时找不到这个方法。

可以看到ButtonCell的代码中并没有这样一段代码

@property (nonatomic, weak) id<ButtonCellActionable> delegate;

或者

@property (nonatomic, strong) void (^buttonAction)(void);

这样我们的ButtonCell不会和VC耦合,修改起来真的很方便

感谢各位的阅读,以上就是“如何使用UITableView”的内容了,经过本文的学习后,相信大家对如何使用UITableView这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用UITableView

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用UITableView

这篇文章主要讲解了“如何使用UITableView”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用UITableView”吧!痛点在我们iOS开发中UITableView几乎是所有Ap
2023-06-04

如何在iOS Apps 创建展开式UITableView

顧名思義,一個展開式 UITableView 是這樣一種表視圖,它「允許」其單元格(cell)展開或者收起,顯示或者隱藏,而在一般的表視圖
2022-06-08

如何高效使用 java.lang.math 类?(java.lang.math类如何使用)

在Java编程中,java.lang.math类是一个非常重要的工具类,它提供了一系列用于数学运算的方法。以下是关于如何使用java.lang.math类的详细教程。一、导入java.lang.math类在Jav
如何高效使用 java.lang.math 类?(java.lang.math类如何使用)
Java2024-12-18

crystaldiskinforh如何使用

这篇文章主要介绍“crystaldiskinforh如何使用”,在日常操作中,相信很多人在crystaldiskinforh如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”crystaldiskinfo
2023-02-09

pandas如何使用

小编给大家分享一下pandas如何使用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、生成数据表 1、首先导入pandas库,一般都会用到numpy库,所以我们
2023-06-02

Nmap如何使用

本篇内容介绍了“Nmap如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Nmap(Network Mapper)是一款开放源代码的网络
2023-06-27

wget如何使用

这篇文章主要讲解了“wget如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“wget如何使用”吧!wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP、HTTPS、FTP
2023-06-28

object.assign()如何使用

这篇“object.assign()如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“object.assign()如何
2023-07-04

WebComponent如何使用

本篇内容介绍了“WebComponent如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!正文WebComponent 是官方定义的自定
2023-07-05

Properties如何使用

本篇内容介绍了“Properties如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!01. 摘要Map 的实现类有 HashMap、
2023-06-16

filezilla如何使用

本篇内容介绍了“filezilla如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!filezilla使用教程1、首先打开软件,在上方输
2023-07-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录