正如在以前的帖子说,但是我在转到故事版(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. hoj2662 Pieces Assignment

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  2. APP为什么会被打回来??

    APP的设置界面, 按钮使用了类似iPhone的操作方式以及icon的圆角设计  ->  重新设计 APP的年龄设置太低  ->  改年龄 APP里有实物奖励  ->  免责声明, ...

  3. Luogu P1514引水入城【搜索】 By cellur925

    题目传送门 这道题开始看好像并没有什么思路,和搜索好像也并没有什么关系.但是我们手玩下样例就会发现,思路其实就三句话:(写这道题的时候在代码里写的) //我们想知道从第1行的每列往下到干旱区的范围 / ...

  4. 转 Vlan

    1.支持VLAN的交换机一定是三层交换机吗?2.Trunk配置了就可以VLAN间通信吗?3.Trunk具体怎么工作的?4.VLAN间的通信到底是怎么执行的?如果说给若干个纯二层环境加上若干个路由器,我 ...

  5. python 基础(八) os模块

    OS模块 概念:包含了普遍的操作 系统的功能 一.函数 函数名 函数说明 os.name 获取操作系统类型 nt->Windows posix->Linux/Unix os.listdir ...

  6. GYM 101889E(dp)

    dp[i][j][k]表示第i位填数字k时,与后面的相连模数为j时,后面的数字最小填多少. 测得我提心吊胆还以为复杂度高了,结果出来46ms还是cf评测姬强啊. #pragma comment(lin ...

  7. 关于Mybatis的一点小记录(parameterType)

    1.Mybatis的parameterType有两个比较常用的,一个是类的对象,还有一个就是Map,然后取值的方法也很简单: 基本数据类型:#{参数} 获取参数中的值 复杂数据类型:#{属性名} ,m ...

  8. asp。Net 页面传值

    00.引言 Web页面是无状态的, 服务器对每一次请求都认为来自不同用户,因此,变量的状态在连续对同一页面的多次请求之间或在页面跳转时不会被保留.在用ASP.NET 设计开发一个Web系统时, 遇到一 ...

  9. Java中的数据类型——通过示例学习Java编程(5)

    作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=15 数据类型用来定义变量可以采用的值,例如,如果变 ...

  10. 编译运行第一个Java程序——通过示例学习Java编程3

    作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=13 在本教程中,我们将了解如何编写.编译和运行Ja ...