tableview 删除cell
正如在以前的帖子说,但是我在转到故事版(StoryBoard)教程之前,我有另外一个问题来回答。
我如何从UITableView删除一行呢?
当人们构建简单的表视图引用程序后,这是另一个常见的问题。同样的,它比你想象的更容易。但在进入编码部分,我打算给你介绍一个程序员使用最多的设计模式,用户界面编程的模型 - 视图 - 控制器模式(Model-View-Controller)。
如果你是认真对待iOS编程的话,你无法逃避学习模型 - 视图 - 控制器(MVC)。除了iOS编程,MVC也常用在其他编程语言如Java,C#。如果你有其他编程背景,MVC对你来说就不是新的了。
理解模型-视图-控制器(MVC)
对于MVC的核心想法,到后来的框架中最有影响力的,就是我所说的关注点分离。关注点分离背后的想法是做出了清晰分离的域对象模型,他们是我们对现实世界的看法,并抽象为对象,最后在屏幕上转换为我们看到的图形用户界面元素。域对象应该是完全独立的,与外部界面完全分离,他们也应该能够支持多个界面,可能同时。这种方法是Unix文化的重要组成部分,并一直延续至今许多通过一个图形界面和命令行界面进行操作的程序。
不管你学什么计算机语言,一个重要的概念,让你成为一个更好的程序员的是关注点分离(SoC)。这个概念是相当简单的,关注软件功能的不同方面。这种概念,鼓励开发人员将一个大的功能或程序分为对多个区域的关注,每个地区都有自己的责任。我们在前面的教程中解释的委托模式通常被作为在iOS编程的一个SOC的例子。
在这里,模型 - 视图 - 控制器的SoC是另一个例子。MVC的核心思想是明确分开的用户界面分为三个区域(或对象组),每个区域负责的特定功能。正如它的名字所暗示的,MVC将用户界面分为三个部分:
模型 -模型是负责用于控制数据或任何对象对数据的操作。该模型可以作为一个数组对象,它存储所有的表格数据并实现添加,编辑和删除的操作实例。在现实中,这些操作通常被称为业务规则。
视图 -视图管理信息的可视化显示。例如,UITableView中显示的信息在表视图格式。
控制器 -控制器是模型和视图之间的桥梁。它转换成适当的行为,在模型中进行用户交互的视图(如TAP)。例如,用户点击删除按钮在视图和控制器,进而触发了在模型中的删除操作。之后,申请视图刷新自己的数据模型来反映更新。
为了更好地帮助你理解MVC,让我们使用简单的表应用程序作为一个例子。该应用程序会显示一个列表的表视图。如果你把概念转化为可视化表示,这里表示数据如何的表中显示:
以MVC模式为例说明了如何使用简单的表
菜单的信息都存储在单独的数组对象模型中。每个表行映射元素的菜单阵列。UITableView的对象是被用户所看到的界面视图。它负责所有的视觉效果(例如颜色表中的行,字体大小和类型)。TableViewController作为的TableView和菜单数据模型之间的桥梁。显示数据的时候,UITableView实际上请求Controller提供数据,Controller就从Model中得到数据.
如何从UITableView删除行
我希望你对模型 - 视图 - 控制器有一个更好的了解。现在,让我们继续前进到编码部分,看看我们如何能够从UITableView中删除行。为了让事情变得简单,我将使用简单的表的应用程序作为一个例子。
如果你完全理解MVC模式,你可能对如何实现删除行有一些想法。有三个主要的事情是我们需要做的:
1。编写代码以切换到编辑模式的行删除
2。从模型中删除行
3 返回相应的表中的数据。刷新表视图,以反映表数据的变化
1.编写代码切换到编辑模式的行删除
在iOS应用程序中,用户通常使用一个“删除”按钮来处理行删除。回想我们以前的程序,我们采用了UITableViewDataSource协议,如果你看过API文档,还有一种方法名为:commitEditingStyle:forRowAtIndexPath。当用户在一行上向左或向右滑动时,表视图检查看是否已经实现该方法。如果实现该方法,表视图会自动显示“删除”按钮。
只需添加以下代码到您的表视图的应用程序,并运行您的应用程序:
|
1
2 3 4 |
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{ } |
即使方法是空的,不执行任何操作,你在行上左右滑动时的时候,你会看到“删除”按钮。
左右滑动删除表中的行
2.从模型中删除相应表中数据
接下来的事情就是将代码添加到方法中来删除实际表中的数据。像其他表视图方法一样,它把indexPath作为参数,来告诉你删除的行号。所以,你可以利用这些信息,来删除相应的数组元素。
简单表格应用程序的源代码中,我们使用NSArray的存储表数据(模型)。NSArray的问题是它的不可编辑的。也就是说,数组一旦被初始化你不能添加/删除其内容。因此,我们将改变NSArray为NSMutableArray,它增加了插入和删除操作:
|
1
2 3 4 5 6 7 8 9 10 11 |
@implementation SimpleTableViewController
{ NSMutableArray *tableData; } - (void)viewDidLoad |
在tableView:commitEditingStyle方法,添加下面的代码来实现从数组中删除实际数据。你的方法应该是这样的:
|
1
2 3 4 5 |
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{ // Remove the row from data model [tableData removeObjectAtIndex:indexPath.row]; } |
NSMutableArray提供了大量的方法来操作的数组内容。在这里,我们利用“removeObjectAtIndex”的方法从数组中删除一个特定的项目。您可以尝试运行的应用程序和删除行。哎呀!应用程序不按预期工作。
这不是一个错误。该应用程序从数组中删除该项目。但为什么删除的项目仍然出现呢?原因在于没有刷新界面,以反映更新的数据模型。
3.刷新表视图
因此,一旦相关的数据将被删除,我们需要调用reloadData方法要求表视图刷新。下面是更新后的代码:
|
1
2 3 4 5 6 7 8 |
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{ // Remove the row from data model [tableData removeObjectAtIndex:indexPath.row]; // Request table view to reload [tableView reloadData]; } |
测试你的应用程序实现删除操作
尝试再次运行您的应用程序和刷卡删除行。您应该能够将其删除。
简单表格应用程序中删除表中的行
与往常一样,离开我的教程,评论,分享您的经验。
tableview 删除cell的更多相关文章
- 使用sqlite3 有关tableview删除cell的问题
在root页面,想要删除tableviewcell,是有一定顺序的 首先要删除 数据库sqlite3 中的数据,然后删除数组中的数据,最后删除cell 一般我们知道,删除cell要在删除数组数据之后, ...
- iOS tableview自定义cell上添加按钮实现删除功能
在删除的时候,先删除数据源,再删除cell 但是,会发现一直崩: numberOfRowsInSection 解决方案:
- tableView中cell的复用机制
TableView的重用机制,为了做到显示和数据分离,IOS tableView的实现并且不是为每个数据项创建一个tableCell.而是只创建屏幕可显示最大个数的cell,然后重复使用这些cell, ...
- 动态展开tableView的cell[2]
动态展开tableView的cell[2] http://code4app.com/ios/%E5%8A%A8%E6%80%81%E6%B7%BB%E5%8A%A0cell/53845f8a933bf ...
- UITableVIew与UICollectionView带动画删除cell时崩溃的处理
UITableVIew与UICollectionView带动画删除cell时崩溃的处理 -会崩溃的原因是因为没有处理好数据源与cell之间的协调关系- 效果: tableView的源码: ModelC ...
- IOS 关于tableview中cell的长按手势
说明:虽然是tableview中cell的长按手势 但是手势是添加在tableview上的 UILongPressGestureRecognizer *longpress = [[UILongPre ...
- 关于tableview内cell自定义的注册以及创建
自定义cell的方法主要有两种,storyboard以及xib(假设新建的是cellTableViewCell类) 比较倾向于xib方式使用xib在xib文件内将自定义的cell绘制好后导入到调用文件 ...
- TableView的cell加载倒计时重用问题解决方案
TableView的cell加载倒计时重用问题解决方案 效果 说明 1. 写过类似需求的朋友一定知道,TableView上面加载倒计时功能会遇到复杂的重用问题难以解决 2. 本人提供一种解决思路,高效 ...
- 解决tableView中cell动态加载控件的重用问题
解决tableView中cell动态加载控件的重用问题 tableView的cell,有时候需要在运行时取得对应的数据后才能够动态的创建该cell中的控件并加载到该cell中,此时,你一定会遇到重用问 ...
随机推荐
- HTTPS为什么更安全,请看这里
本文转载于https://foofish.net/https-story-1.html HTTPS 是建立在密码学基础之上的一种安全通信协议,严格来说是基于 HTTP 协议和 SSL/TLS 的组合. ...
- 调用Web API将文件上传到服务器的方法(.Net Core)
最近遇到一个将Excel通过Web API存到服务器的问题,其中涉及到Excel的读取.调用API.Web API怎么进行接收. 一. Excel的读取.调用API Excel读取以及调用API的代 ...
- 学习Mahout(三)
开发+运行第一个Mahout的程序 代码: /** * Licensed to the Apache Software Foundation (ASF) under one or more * con ...
- iOS开发 - 多线程实现方案之GCD篇
GCD概念 GCD为Grand Central Dispatch的缩写,纯c语言编写,是Apple开发的一个多核编程的较新的解决方法.它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统.它是 ...
- Info.plist配置相关文件访问权限
<key>NSAppleMusicUsageDescription</key> <string>App需要您的同意,才能访问媒体资料库</string> ...
- laravel配合swoole使用总结
最近对接硬件做了两个项目,用到了swoole 第一个是门禁系统,需要远程开门.离线报警.定时开门.离线刷卡等功能 1.远程开门: 目前用cli创建个临时客户端连接服务端发送命令,服务端处理完成后客户端 ...
- UVa12716:gcd等于xor(打表+类素数筛+差分约束)
紫书给的分析缺少一些证明性的东西,将我自己的OneNote笔记贴在这里.
- python入门之正则表达式
正则 通过re模块实现 eg:>>>import re >>>re.findall('abc',str_name) 在strname里面完全匹配字符串 ...
- vuex2 10分钟快速入门
因为太简单了,我直接就贴代码了~ #建立store.js import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex) export de ...
- I/O————数据流
如何将一个long类型的数据写入文件中? 转字符串 → 通过 getbytes() 写进去,费劲,而且在此过程中 long 类型的数需要不断地转换. 现在,Java 中的数据流能够很好的解决这个问题( ...