前言
UI界面信息的更新,归根结底是对数据的操作。因此,最正确的姿势应该是:先修改数据源-->后刷新界面;并不是针对某个界面上的控件进行直接赋值或直接修改,这样的操作大部分会造成界面显示混乱的情况。
Tip1:刷新�操作
// 这个是在项目中UITableView使用最多的的刷新方式了吧
- (void)reloadData;
// 刷新每个分段(或着叫分区/分组)的标题信息
- (void)reloadSectionIndexTitles;
// 刷新一组数据(一个分区/一个分段)
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
// 刷新一行数据
- (void)reloadRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
说明:
- 对于UITableView的数据刷新Apple提供了这4个接口。针对添加、删除、插入和排序等,在对界面进行相应操作后,这些操作针对操作过的行或组也进行了相应地刷新。因为不属于单纯的刷新,不列入在内。
- 对于UITableView的数据操作,大部分的数据都可以放在一个数组中。在对界面的某一行或组进行修改等操作时,最好直接去修改这个数组,然后通过上面提到的四个接口进行刷新。
- 针对插入、删除、移动,同样是要修改数组,稍微不同的是,需要重写这些方法,在里面完成对数组的插入、删除和移动等操作。
简单的代码片段
/* 声明一个m_listData为UITableView的数据源数组 */
- (void)viewDidLoad {
[super viewDidLoad];
m_listData = [[NSMutableArray alloc] initWithObjects:@"测试行",@"测试行",@"测试行",@"测试行",@"测试行", nil];
CGRect frame = CGRectMake(0, TopBarHeight, SCREEN_WIDTH, SCREEN_HEIGHT-TopBarHeight);
_tableView = [[UITableView alloc] initWithFrame:frame style:UITableViewStylePlain];
_tableView.dataSource = self;
_tableView.delegate = self;
_tableView.rowHeight = 60;
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_tableView.tableFooterView = [[UIView alloc] init];
[self.view addSubview:_tableView];
[_tableView registerClass:[FHMainViewCell class] forCellReuseIdentifier:FHMainCellID];
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"刷新" style:UIBarButtonItemStylePlain target:self action:@selector(onTap)];
self.navigationItem.rightBarButtonItem = item;
}
#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return m_listData.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:FHMainCellID];
cell.textLabel.text = m_listData[indexPath.row];
return cell;
}
// 刷新操作(在这里修改数组,并进行刷新)
- (void)onTap {
[m_listData replaceObjectAtIndex:0 withObject:@"替换的内容"];
// 行刷新
NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:0];
NSArray *array = @[path];
[_tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationRight];
// 组刷新方式
// NSIndexSet *section = [NSIndexSet indexSetWithIndex:1];
// [_tableView reloadSections:section withRowAnimation:UITableViewRowAnimationLeft];
}
Tip2:滚动操作
// 有时间了再更新
Tip3:编辑操作
// 有时间了再更新