正如在以前的帖子说,但是我在转到故事版(StoryBoard)教程之前,我有另外一个问题来回答。

我如何从UITableView删除一行呢?

当人们构建简单的表视图引用程序后,这是另一个常见的​​问题。同样的,它比你想象的更容易。但在进入编码部分,我打算给你介绍一个程序员使用最多的设计模式,用户界面​​编程的模型 - 视图 - 控制器模式(Model-View-Controller)。

如果你是认真对待iOS编程的话,你无法逃避学习模型 - 视图 - 控制器(MVC)。除了iOS编程,MVC也常用在其他编程语言如Java,C#。如果你有其他编程背景,MVC对你来说就不是新的了。

理解模型-视图-控制器(MVC)

对于MVC的核心想法,到后来的框架中最有影响力的,就是我所说的关注点分离。关注点分离背后的想法是做出了清晰分离的域对象模型,他们是我们对现实世界的看法,并抽象为对象,最后在屏幕上转换为我们看到的图形用户界面元素。域对象应该是完全独立的,与外部界面完全分离,他们也应该能够支持多个界面,可能同时。这种方法是Unix文化的重要组成部分,并一直延续至今许多通过一个图形界面和命令行界面进行操作的程序。

Martin Fowler

不管你学什么计算机语言,一个重要的概念,让你成为一个更好的程序员的是关注点分离(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。当用户在一行上向左或向右滑动时,表视图检查看是否已经实现该方法。如果实现该方法,表视图会自动显示“删除”按钮。

只需添加以下代码到您的表视图的应用程序,并运行您的应用程序:




- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{

}

即使方法是空的,不执行任何操作,你在行上左右滑动时的时候,你会看到“删除”按钮。

左右滑动删除表中的行

2.从模型中删除相应表中数据

接下来的事情就是将代码添加到方法中来删除实际表中的数据。像其他表视图方法一样,它把indexPath作为参数,来告诉你删除的行号。所以,你可以利用这些信息,来删除相应的数组元素。

简单表格应用程序的源代码中,我们使用NSArray的存储表数据(模型)。NSArray的问题是它的不可编辑的。也就是说,数组一旦被初始化你不能添加/删除其内容。因此,我们将改变NSArray为NSMutableArray,它增加了插入和删除操作:










10
11
@implementation SimpleTableViewController 

    NSMutableArray *tableData; 
}

- (void)viewDidLoad 

    [super viewDidLoad]; 
    // Initialize table data 
    tableData = [NSMutableArray arrayWithObjects:@"Egg Benedict", @"Mushroom Risotto", @"Full Breakfast", @"Hamburger", @"Ham and Egg Sandwich", @"Creme Brelee", @"White Chocolate Donut", @"Starbucks Coffee", @"Vegetable Curry", @"Instant Noodle with Egg", @"Noodle with BBQ Pork", @"Japanese Noodle with Pork", @"Green Tea", @"Thai Shrimp Cake", @"Angry Birds Cake", @"Ham and Cheese Panini", nil]; 
}

在tableView:commitEditingStyle方法,添加下面的代码来实现从数组中删除实际数据。你的方法应该是这样的:





- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 

    // Remove the row from data model 
    [tableData removeObjectAtIndex:indexPath.row]; 
}

NSMutableArray提供了大量的方法来操作的数组内容。在这里,我们利用“removeObjectAtIndex”的方法从数组中删除一个特定的项目。您可以尝试运行的应用程序和删除行。哎呀!应用程序不按预期工作。

这不是一个错误。该应用程序从数组中删除该项目。但为什么删除的项目仍然出现呢?原因在于没有刷新界面,以反映更新的数据模型。

3.刷新表视图

因此,一旦相关的数据将被删除,我们需要调用reloadData方法要求表视图刷新。下面是更新后的代码:








- (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的更多相关文章

  1. 使用sqlite3 有关tableview删除cell的问题

    在root页面,想要删除tableviewcell,是有一定顺序的 首先要删除 数据库sqlite3 中的数据,然后删除数组中的数据,最后删除cell 一般我们知道,删除cell要在删除数组数据之后, ...

  2. iOS tableview自定义cell上添加按钮实现删除功能

    在删除的时候,先删除数据源,再删除cell 但是,会发现一直崩: numberOfRowsInSection 解决方案:

  3. tableView中cell的复用机制

    TableView的重用机制,为了做到显示和数据分离,IOS tableView的实现并且不是为每个数据项创建一个tableCell.而是只创建屏幕可显示最大个数的cell,然后重复使用这些cell, ...

  4. 动态展开tableView的cell[2]

    动态展开tableView的cell[2] http://code4app.com/ios/%E5%8A%A8%E6%80%81%E6%B7%BB%E5%8A%A0cell/53845f8a933bf ...

  5. UITableVIew与UICollectionView带动画删除cell时崩溃的处理

    UITableVIew与UICollectionView带动画删除cell时崩溃的处理 -会崩溃的原因是因为没有处理好数据源与cell之间的协调关系- 效果: tableView的源码: ModelC ...

  6. IOS 关于tableview中cell的长按手势

    说明:虽然是tableview中cell的长按手势  但是手势是添加在tableview上的 UILongPressGestureRecognizer *longpress = [[UILongPre ...

  7. 关于tableview内cell自定义的注册以及创建

    自定义cell的方法主要有两种,storyboard以及xib(假设新建的是cellTableViewCell类) 比较倾向于xib方式使用xib在xib文件内将自定义的cell绘制好后导入到调用文件 ...

  8. TableView的cell加载倒计时重用问题解决方案

    TableView的cell加载倒计时重用问题解决方案 效果 说明 1. 写过类似需求的朋友一定知道,TableView上面加载倒计时功能会遇到复杂的重用问题难以解决 2. 本人提供一种解决思路,高效 ...

  9. 解决tableView中cell动态加载控件的重用问题

    解决tableView中cell动态加载控件的重用问题 tableView的cell,有时候需要在运行时取得对应的数据后才能够动态的创建该cell中的控件并加载到该cell中,此时,你一定会遇到重用问 ...

随机推荐

  1. laravel 报错htmlspecialchars() expects parameter 1 to be string, object given

    翻译过来就是     期望参数1是字符串 意思就是说变量为数组,应以数组的方式输出 @foreach($xxx as $k=>$y) {{$k}}{{$y}} @endforeach

  2. 如何解决netty发送消息截断问题

      在netty开发过程中我遇到过长的消息被分割成多个小消息的问题.如下图所示: 其实这两条消息应该是一条消息,它们两个才是一个完整的json字符串.查看代码原来是客户端与服务器端都没有考虑TCP粘包 ...

  3. bzoj 1494 生成树计数

    坑了好多天的题,终于补上了 首先发现 \(i\) 这个点和 \(i-k\) 之前的点没有边,所以 \(i-k\) 之前的点肯定联通,只要处理中间 \(k\) 个点的联通状态就好了.我们用最小表示法,\ ...

  4. UVa10375:选择与除法(唯一分解定理)

    The binomial coefficient C(m,n) is defined as Given four natural numbers p, q, r, and s, compute the th ...

  5. Script to Monitor Current User Activity in the Database

    Execution Environment: SQL, SQL*Plus, iSQL*Plus Access Privileges: Requires select privileges on vie ...

  6. NodeJs前端构建工具 ——————之Grunt篇

    为何使用grunt? 如何搭建grunt? 开始第一个grunt项目 基础()合并js文件 开始第一个grunt项目 基础()压缩js 开始第一个grunt项目 基础()代码规范检测 开始第一个gru ...

  7. CentOS 7.4升级curl和git到最新版本

    升级curl和git到最新版本 [root@jenkins ~]# yum install -y curl-devel expat-devel gettext-devel openssl-devel ...

  8. simhash与重复信息识别

    在工作学习中,我往往感叹数学奇迹般的解决一些貌似不可能完成的任务,并且十分希望将这种喜悦分享给大家,就好比说:“老婆,出来看上帝”…… 随着信息爆炸时代的来临,互联网上充斥着着大量的近重复信息,有效地 ...

  9. android开发学习 ------- 自定义View 圆 ,其点击事件 及 确定当前view的层级关系

    我需要实现下面的效果:   参考文章:https://blog.csdn.net/halaoda/article/details/78177069 涉及的View事件分发机制 https://www. ...

  10. 第六章 设计程序架构 之 设计实现WebSocket策略

    1. 概述 传统网页的通信方式是请求-响应模式,每次请求-响应都是新的连接.连接的建立和断开也是需要消耗资源的. WebSocket是基于TCP协议,实现单个连接上的双向通信. 本章内容包括: 异步读 ...