tableview 删除cell

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

时间: 2024-10-06 23:30:33

tableview 删除cell的相关文章

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

在root页面,想要删除tableviewcell,是有一定顺序的 首先要删除 数据库sqlite3 中的数据,然后删除数组中的数据,最后删除cell 一般我们知道,删除cell要在删除数组数据之后,因为如果cell是在删除数组之前删除,那么,delegate中的方法-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 一直在执行,当数组中个数未变,cell减少一个的时候,就

UITableView (4): 在TableView中移动cell和Section 从TableView中删除cell和section

一  .问题:你想用流畅直观的动画来移动和拖拽TableView中的cell和section 方案: 用moveSection:toSection:方法把一个Section移动到新位置. 用moveRowAtIndexPath:toIndexPath:方法把一个cell从当前位置移动到新位置 例子: 创建一个TableView并在其中加载3个Section,每个Section有3个cell #pragma - mark 初始化数据 - (NSMutableArray *)newSectionWi

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

-会崩溃的原因是因为没有处理好数据源与cell之间的协调关系- 效果: tableView的源码: ModelCell.h + ModelCell.m // // ModelCell.h // Set // // Created by YouXianMing on 14/11/24. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import <UIKit/UIKit.h> @class ModelCell; @pro

iOS 在TableView的Cell之间设置空白间隔空间

1.设置section的数目,即是你有多少个cell - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 3; // in your case, there are 3 cells } 2.对于每个section返回一个cell - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)secti

Popovercontroller中显示tableView的cell个数

在Popovercontroller中显示tableView,用多少cell,就显示多少cell,去掉多余空白的cell 在控制器中设置 - (void)viewDidLoad{    [super viewDidLoad]; //self.contentSizeForViewInPopover = CGSizeMake(320, 44 * self.menuItems.count);//ios7之前的方法    self.preferredContentSize = CGSizeMake(15

处理TableView中cell不同状态切换的问题

效果 说明 有时候,我们需要处理TableView中cell的各种状态,比如选中,未选中或者无效状态等,虽然我们都可以很容易的实现出来,但是考虑到代码的可读性以及可维护性,需要进行一定的设计才行. 1. 状态需要封装在Model中,让model自己管理 2. cell只需要判断model中的状态,然后进行相应的改变即可 源码 https://github.com/YouXianMing/TableViewState // // ModelData.h // TableViewState // /

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

tableView的cell,有时候需要在运行时取得对应的数据后才能够动态的创建该cell中的控件并加载到该cell中,此时,你一定会遇到重用问题,即使你能做到该cell只根据数值加载了一回控件,你也没法保证不出现重用问题:) 效果(请注意查看,移动下面的格子时,上面出现了重用的问题) 源码: YXCell.h // // YXCell.h // YXTableView // // Copyright (c) 2014年 Y.X. All rights reserved. // #import

适配ios11 tableview的cell与状态栏的问题

最近在做适配ios11时发现tableview的cell初始位置是在状态栏下方,如图 如果想让cell起始位置置顶解决办法如下 //配置状态栏 if(@available(iOS 11.0, *)){ self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } else { self.automaticallyAdjustsScrollViewInsets = NO; }

tableView 删除一行后下一行点击事件被忽略

[转]- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { returnUITableViewCellEditingStyleDelete; } - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEdi