当前位置:首页 > 图片 > 国内图片 > 正文
文章正文

ios tableview 动态添加数据 iOS基础教程:关于iOS tableView表视图编辑模式

图片 > 国内图片 > :ios tableview 动态添加数据 iOS基础教程:关于iOS tableView表视图编辑模式是由美文导刊网(www.eorder.net.cn)为您精心收集,如果觉得好,请把这篇文章复制到您的博客或告诉您的朋友,以下是ios tableview 动态添加数据 iOS基础教程:关于iOS tableView表视图编辑模式的正文:

iOS基础教程:关于iOS tableView表视图编辑模式

无限互联:关于iOS tableView表视图编辑模式

昨天有一名iOS学习爱好者在网上咨询iOS培训的老师关于iOS tableView表视图编辑模式的问题,因此劲头无限互联iOS培训的老师就“关于iOS tableView表视图编辑模式”的整理了一些知识点,希望对广大iOS学员有所帮助!

在viewDidLoad方法里面指定导航栏的右按钮为edit按钮

self.navigationItem.rightBarButtonItem =self.editButtonItem;

另一种进入编辑模式的方式是修改tableView的editing属性

该属性是一个BOOL类型,默认值是NO,这里给导航栏添加一个左按钮,通过点击左按钮修改editing属性的值

进入和退出编辑模式

- (void)editTableView:(UIBarButtonItem *)button

{

//修改editing属性的值,进入或退出编辑模式

[self.tableView setEditing:!self.tableView.editinganimated:YES];

if(self.tableView.editing){

button.title = @"完成";

}

else{

button.title = @"编辑";

}

}

无限互联:关于iOS tableView表视图编辑模式

TableView常用操作

1、标记行

标记行指的是单击此行,可以实现在此行右边出现一个勾,为了实现标记功能,在ViewController.m中@end之前添加代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell *oneCell = [tableView cellForRowAtIndexPath: indexPath];

if (oneCell.accessoryType == UITableViewCellAccessoryNone) {

oneCell.accessoryType = UITableViewCellAccessoryCheckmark;

} else

oneCell.accessoryType = UITableViewCellAccessoryNone;

[tableView deselectRowAtIndexPath:indexPath animated:YES];

}

该代码实现:单击某行时,若此行未被标记,则标记此行;若此行已经被标记,则取消标记。

2、移动行

想要实现移动或者删除行这样的操作,需要启动表格的编辑模式。使用的是setEditing:animated:方法。

1.打开ViewController.xib,将其中的表格控件映射成Outlet到ViewController.h,名称为myTableView。

2.打开ViewController.m,在viewDidLoad方法最后添加代码:

[self.myTableView setEditing:YES animated:YES];

3.在@end之前添加代码:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView

editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {

return UITableViewCellEditingStyleNone;

}

//这个方法用来告诉表格 这一行是否可以移动

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {

return YES;

}

//这个方法就是执行移动操作的

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)

sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath {

NSUInteger fromRow = [sourceIndexPath row];(ios tableview 动态添加数据)

NSUInteger toRow = [destinationIndexPath row];

id object = [list objectAtIndex:fromRow];

[list removeObjectAtIndex:fromRow];

[list insertObject:object atIndex:toRow];

}

3.插入行

首先将editingStyleForRowAtIndexPath方法中的UITableViewCellEditingStyleDelete修改成UITableViewCellEditingStyleInsert。

添加代码:

else {

//我们实现的是在所选行的位置插入一行,因此直接使用了参数indexPath

NSArray *insertIndexPaths = [NSArray arrayWithObjects:indexPath,nil];

//同样,将数据加到list中,用的row

[self.list insertObject:@"新添加的行" atIndex:row];

[tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationRight];

}

上面的代码中也可以不用insertRowsAtIndexPaths方法,而直接使用[tableView reloadData];语句,但是这样就没有添加的效果了。

4.删除行

将editingStyleForRowAtIndexPath方法中的UITableViewCellEditingStyleNone修改成UITableViewCellEditingStyleDelete。

在@end之前添加代码:

/这个方法根据参数editingStyle是UITableViewCellEditingStyleDelete

//还是UITableViewCellEditingStyleDelete执行删除或者插入

- (void)tableView:(UITableView *)tableView commitEditingStyle:

(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if (editingStyle == UITableViewCellEditingStyleDelete) {

NSUInteger row = [indexPath row];

[self.list removeObjectAtIndex:row];

[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]

withRowAnimation:UITableViewRowAnimationAutomatic];

}

}

iOS培训机构首选无限互联iOS培训,iOS培训引领者,专注iOS培训,用心做靠谱的iOS培训机构。

原文链接:返回搜狐,查看更多

iOS开发 精简TableView

翻译、修改自objc.io

原文链接:

导语

TableView 是iOS app 中最常用的控件,许多代码直接或者间接的关联到table view任务中,包括提供数据、更新tableView、控制tableView行为等等。下面会提供保持tableView代码整洁和结构清晰的方法。

UITableViewController vs. UIViewController

TableViewController的特性

table view controllers可以读取table view的数据、设置tabvleView的编辑模式、反应键盘通知等等。同时Table view controller能够通过使用UIRefreshControl来支持“下拉刷新”。

Child View Controllers

tableViewController也可以作为child view controller添加到其他的viewController中,然后tableViewController会继续管理tableView,而parentViewController能管理其他我们关心的东西。

-(void)addDetailTableView

{

DetailViewController *detail = [DetailViewController new];

[detail setup];

detail.delegate = self;

[self addChildViewController:detail];

[detail setupView];

[self.view addSubview:detail.view];

[detail didMoveToParentViewController:self];

}

如果在使用以上代码时,需要建立child View controller 和 parent view controller之间的联系。比如,如果用户选择了一个tableView里的cell,parentViewController需要知道这件事以便能够响应点击时间。所以最好的方法是table view controller定义一个协议,同时parent view controller实现这个协议。

@protocol DetailViewControllerDelegate

-(void)didSelectCell;

@end

@interface ParentViewController () <DetailViewControllerDelegate>

@end

@implementation ParentViewController

//....

-(void)didSelectCell

{

//do something...

}

@end

虽然这样会导致view controller之间的频繁交流,但是这样保证了代码的低耦合和复用性。

分散代码

在处理tableView的时候,会有各种各样不同的,跨越model层、controller层、view层的任务。所以很有必要把这些不同的代码分散开,防止viewController成为处理这些问题的“堆填区”。尽可能的独立这些代码,能够使代码的可读性更好,拥有更好的可维护性与测试性。

这部分的内容可以参考,而在tableView这一章中,将会专注于如何分离view和viewController

消除ModelObeject和Cell之间的隔阂

在很多情况下,我们需要提交我们想要在view层展示的数据,同时我们也行维持view层和model层的分离,所以tableView中的dateSource常常做了超额的工作:

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

{

Cell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

[cell setup];

NSString *text = self.title;

cell.label.text = text;

UIImage *photo = [UIImage imageWithName:text];

cell.photoView.image = photo;

}

这样dataSorce会变得很杂乱,应该将这些东西分到cell的category中。

@implementation Cell (ConfigText)(ios tableview 动态添加数据)

-(void)configCellWithTitle:(NSString *)title

{

self.label.text = title;

UIImage *photo = [UIImage imageWithName:title];

cell.photoView.image = photo;

return cell;

}

这样的话dataSource将会变得十分简单。

(ios tableview 动态添加数据)

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

{

Cell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

[cell configCellWithTitle:self.title];

return cell;

}

复用cell

其实还可以更进一步,让同一个cell变得可以展示多种的modelObject。首先需要在cell中定义一个协议,想要在这个cell中展示的object必须遵守这个协议。然后可以修改分类中config method来让object来遵守这个协议,这样cell就能适应不同的数据类型。

在cell中处理cell状态

如果想要对tableView的行为进行设置,如选中操作后改变高光状态等,可以在tableViewController中使用委托方法:

-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath

{

Cell *cell = [tableView cellForRowAtIndexPath:indexPath];

cell.label.shadowColor = [UIColor greenColor];

}

-(void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath

{

Cell *cell = [tableView cellForRowAtIndexPath:indexPath];

cell.label.shadowColor = nil;

}

然而当想要换出这些cell或者想要重新设计的时候,仍然需要适应委托方法。cell里面的detail的实现和委托方法中对detail的实现交织在一起,所以应该将这些逻辑移到cell里面:

@implementation Cell

//...

-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated

{

[super setHighlighted:highlighted animated:animated];

if(highlighted)

{

self.label.shadowColor = [UIColor greenColor];

}

else

{

(ios tableview 动态添加数据)

self.label.shadowColor = nil;

}

}

@end

一个委托需要知道一个view的不同状态,但它不需要知道怎么去修改view或者有哪些属性需要设置来使这个view转变状态,所有的逻辑应该又view来完成,而在外部只是仅仅提供一个API。这样才是view层和controller层实现代码之间的有效分离。

处理不同的cell类型

如果在一个tableView中有不同的cell类型,dataSource将会变得膨胀而难以操作,在下面的代码中,有两个不同的cell类型,一个负责展示图片和标题,另一个负责展示星标。为了分离处理不同的cell的代码,dataSource方法只是仅仅执行不同cell自己的设置方法。

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

{

BOOL isStarRank = self.keys[(NSUInteger)indexPath.row];

UITableViewCell *cell;

if(isStarRank)

{

cell = [self setupStarCell];

}

else

{

cell = [self setupDefaultCell];

}

}

-(StarCell *)setupStarCell

{

//do something...

}

-(UITableViewCell *)setupDefaultCell

{

//do something...

}

编辑TableView

TableView提供了方便的编辑功能,能够删除和移动cell。这些事件中,tableView的dataSource通过委托方法获取通知,因此经常在这些委托方法中出现对数据的修改,而修改数据很明显是model层的任务。model应该提供删除、排序等的接口,这样就能够通过dataSource的方法来调用。从而controller扮演了view和model之间的协调者,而不需要知道model层的实现细节。同时这样model的逻辑会变得更容易测试,因为没有混杂viewController的任务。

总结

tableViewController以及其他controller应该扮演model和view的协调者和中介者,而不应该关心属于view或者model层的任务。谨记这点,让委托和dataSource变得更小和只包含公式化的代码。

这不只是减少tableViewController的体积和复杂度,同时也把域逻辑和界面逻辑放到相关的类中,把实现细节包裹在简单的API接口中,最终提高了代码的可读性和代码的协调能力。返回搜狐,查看更多


一.iOS开发,点击按钮,tableviewcell动态增加一行,求指教10分

-(IBAction)addRows:(id)sender{
NSMutableArray *indexPaths = [[NSMutableArray alloc] init];
for (int i=0; i<3; i++) {
NSString *s = [[NSString alloc] initWithFormat:@”hello %d”,i];
[datas addObject:s];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];
[indexPaths addObject: indexPath];
}
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewScrollPositionNone];
[self.tab粻穿纲费蕺渡告杀梗辑leView endUpdates];
}


二.ios怎么做到tableviewcell多少随日期改变动态添加

给cell增加类方法,传递个数据过去,在类方法里面根据数据判断
实现UITableViewDelegate的委长饥拜渴之韭瓣血抱摩托方法
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath


三.ios tableview 重新加载数据怎么写

报错说的很清楚了啊,你看看有没有拼错比如把 tableView 写成了tableview ,看看尝肠佰段脂灯拌犬饱华你的CloudController里是不是真的有property tableview


四.ios 在cell中请求的数据 怎么刷新tableview

//一个section刷新
NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:2];
[tableview reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];

//一个cell刷新
NSIndexPath *indexPath=[NSIndexPath indexPathForRow:3 inSection:0];
[tableView reloadRowsAtIndexPaths:[NSAr肠偿斑锻职蹬办拳暴哗ray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationNone];


五.ios开发,xcode里面入如何用按钮动态实现添加行?

[self.tableView deleteRowsAtIndexPaths:@[subpath] withRowAnimation:UITableViewRowAnimationFade];
UITableViewRowAnimationFade是删除时的动画效果,
subpath是要删除的indexpath的集合数组 indexpath由section 和 row两个信息构成
添加把delete改称insert


六.IOS tableview重新加载数据

报错说的很清楚了啊,你看看有没有拼错比如把 tableView 写成了tableview ,看看你的C发穿篡费诂渡磋杀单辑loudController里是不是真的有property tableview


七.怎么动态添加一个UITableViewCell到UITableView

[_tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:U粻鸡纲课蕺酒告旬梗莫ITableViewRowAnimationRight];

别忘了同时更新数据源

ios tableview 动态添加数据 iOS基础教程:关于iOS tableView表视图编辑模式由美文导刊网(www.eorder.net.cn)收集整理,转载请注明出处!原文地址http://www.eorder.net.cn/pic51228/

文章评论
Copyright © 2006 - 2016 www.eorder.net.cn All Rights Reserved
美文导刊网 版权所有