您的位置:首页 > 移动开发 > IOS开发

IOS tableView的数据刷新

2017-03-10 14:02 411 查看
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "PingFang SC" }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; min-height: 16.0px }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #bb2ca2 }
span.s1 { font: 11.0px Menlo; color: #272ad8 }
span.s2 { }
span.s3 { font: 14.0px "PingFang SC" }
span.s4 { font: 14.0px Menlo }
span.s5 { font: 11.0px Menlo; color: #bb2ca2 }
span.s6 { color: #272ad8 }
span.s7 { font: 14.0px "PingFang SC"; color: #000000 }
1.tableView的刷新

1> 数据刷新的总体步骤

* 修改模型数据

* 刷新表格(刷新界面)

2> 刷新表格(刷新界面)的方法

* 全局刷新(每一行都会重新刷新)

- (void)reloadData;

* 局部刷新(使用前提: 刷新前后, 模型数据的个数不变)

- (void)reloadRows:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

* 局部删除(使用前提: 模型数据减少的个数 == indexPaths的长度)

- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

实例:

#define NJContactsPath [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"contacts.arc"]

@interface NJContatcsViewController ()<UIActionSheetDelegate, NJAddViewControllerDelegate, NJEditViewControllerDelegate>
/**
*  点击注销按钮
*/
- (IBAction)logout:(UIBarButtonItem *)sender;

/**
*  保存所有用户数据
*/
@property (nonatomic, strong) NSMutableArray *contatcs;
@end

@implementation NJContatcsViewController
- (void)viewDidLoad
{
[super viewDidLoad];

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

// 给当前控制器的当行控制器添加一个按钮
UIBarButtonItem *addBtn = self.navigationItem.rightBarButtonItem;
UIBarButtonItem *editBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(editBtnClick)];

self.navigationItem.rightBarButtonItems = @[editBtn, addBtn];
}

- (void)editBtnClick
{
//    NSLog(@"editBtnClick");
// 开启tableview的编辑模式
//    self.tableView.editing = !self.tableView.editing;
[self.tableView setEditing:!self.tableView.editing animated:YES];
}

- (IBAction)logout:(UIBarButtonItem *)sender
{
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"确定要注销?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"确定" otherButtonTitles:nil];
[sheet showInView:self.view];

}
#pragma mark - UIActionSheetDelegate
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (0 != buttonIndex) return;

// 移除栈顶控制器
[self.navigationController popViewControllerAnimated:YES];
}

// 无论是手动类型的segue还是自动类型的segue, 在跳转之前都会执行该方法
// 控制器跳转之前(执行segue之前)执行
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// 0.判断目标控制器是添加还是编辑
// 1.取出目标控制器
UIViewController *vc = segue.destinationViewController;
if ([vc isKindOfClass:[NJAddViewController class]]) {
NJAddViewController *addVc = (NJAddViewController *)vc;
// 2.设置代理
addVc.delegate = self;
}else if ([vc isKindOfClass:[NJEditViewController class]]){
// 传递数据
NJEditViewController *editVc = (NJEditViewController *)vc;

// 通过tableview获取被点击的行号
NSIndexPath *path = [self.tableView indexPathForSelectedRow];
// 取出被点击行的模型
NJContatc *c = self.contatcs[path.row];
NSLog(@"联系人列表 %p" , c);
// 赋值模型
editVc.contatc = c;
// 设置代理
editVc.delegate = self;
}
}

#pragma mark - NJEditViewControllerDelegate
- (void)editViewControllerDidClickSavBtn:(NJEditViewController *)editViewController contatc:(NJContatc *)cpmtatc
{
// 0.更新保存的数据
//    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"contacts.arc"];
[NSKeyedArchiver archiveRootObject:self.contatcs toFile:NJContactsPath];

// 1.刷新表格
[self.tableView reloadData];
}

#pragma mark - NJAddViewControllerDelegate
- (void)addViewControllerDidAddBtn:(NJAddViewController *)editViewController contatc:(NJContatc *)contatc
{
// 1.保存数据到数组中
[self.contatcs addObject:contatc];

// 在这个地方保存用户添加的所有的联系人信息
//    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject ] stringByAppendingPathComponent:@"contacts.arc"];
[NSKeyedArchiver archiveRootObject:self.contatcs toFile:NJContactsPath];

// 2.刷新表格
[self.tableView reloadData];
}

#pragma mark - 数据源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.contatcs.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 1.创建cell
NJContatcCell *cell  = [NJContatcCell cellWithTableView:tableView];
// 2.设置模型
// 设置数据
NJContatc *c = self.contatcs[indexPath.row];//0
cell.contatc = c;
// 2.返回cell
return cell;
}

// 只在在tableview的编辑模式下才有添加

// 只要实现该方法, 手指在cell上面滑动的时候就自动实现了删除按钮
// commitEditingStyle: 传入提交的编辑操作(删除/添加)
// forRowAtIndexPath: 当前正在编辑的行
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
//    NSLog(@"%d", indexPath.row);

if (UITableViewCellEditingStyleDelete == editingStyle) {
// 1.修改数据
[self.contatcs removeObjectAtIndex:indexPath.row];
// 2.刷新表格
// reloadData会重新调用数据的所有方法,刷新所有的行
//    [self.tableView reloadData];

// 该方法用于删除tableview上指定行的cell
// 注意:使用该方法的时候,模型中删除的数据的条数必须和deleteRowsAtIndexPaths方法中删除的条数一致,否则会报错
// 简而言之,就删除的数据必须和删除的cell保持一致
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];

// 3.更新保存的文件
[NSKeyedArchiver archiveRootObject:self.contatcs toFile:NJContactsPath];

}else if (UITableViewCellEditingStyleInsert == editingStyle)
{
// 添加一条数据
//        NSLog(@"添加一条数据");

// 1.修改数据
NJContatc *c = [[NJContatc alloc] init];
c.name = @"xff";
c.phoneNumber = @"123456";

//        [self.contatcs addObject:c];
[self.contatcs insertObject:c atIndex:indexPath.row + 1];

//        NJContatc *c1 = [[NJContatc alloc] init];
//        c1.name = @"xzz";
//        c1.phoneNumber = @"123456";
//        [self.contatcs insertObject:c1 atIndex:indexPath.row + 2];

// 2.刷新表格
//        [self.tableView reloadData];

NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row + 1 inSection:0];
// 注意点:数组中插入的条数必须和tableview界面上插入的cell条一致
// 否则程序会报错
[self.tableView insertRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationBottom];
}

}

// 用于告诉系统开启的编辑模式是什么模式
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
//    NSLog(@"indexPath = %d", indexPath.row);
//    return UITableViewCellEditingStyleInsert;

if (indexPath.row % 2 == 0) {
return UITableViewCellEditingStyleInsert;
}else
{
return UITableViewCellEditingStyleDelete;
}
}

#pragma mark - 懒加载
- (NSMutableArray *)contatcs
{
if (_contatcs == nil) {

// 1.获取路径
//        NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"contacts.arc"];
// 2.从文件中读取数组
_contatcs =  [NSKeyedUnarchiver unarchiveObjectWithFile:NJContactsPath];

// 3.如果第一次启动没有文件,就创建一个空的数组用于保存数据
if (_contatcs == nil) {
_contatcs = [NSMutableArray array];
}

}
return _contatcs;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: