效果图如下:
先介绍一下数据刷新:
数据刷新- 添加数据
- 删除数据
- 更改数据
[self.tableView reloadData];
// 屏幕上的所有可视的cell都会刷新一遍
局部刷新方法
- 添加数据
NSArray *indexPaths = @[
[NSIndexPath indexPathForRow:0 inSection:0],
[NSIndexPath indexPathForRow:1 inSection:0]
];
[self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationRight];
- 删除数据
NSArray *indexPaths = @[
[NSIndexPath indexPathForRow:0 inSection:0],
[NSIndexPath indexPathForRow:1 inSection:0]
];
[self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationMiddle];
- 更新数据(没有添加和删除数据,仅仅是修改已经存在的数据)
NSArray *indexPaths = @[
[NSIndexPath indexPathForRow:0 inSection:0],
[NSIndexPath indexPathForRow:1 inSection:0]
];
[self.tableView relaodRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationMiddle];
实现上面效果图的思路:
1. 整个界面是由橙色的UIView 和 UITableView组成的,所以在storyboard中用UIVIewController就行
2. 创建一个酒模型,用来给每一行cell设置数据.ZYWine
3. 创建一个继承UITableViewCell 的ZYWineCell 用来接收酒模型传来的数据
4. 实现tableView的数据源方法,给ZYWineCell 设置每一行数据
5. 当点击添加按钮,增加一行cell,点击更新按钮就修改cell的数据,点击删除按钮就删除一行cell
6. 通过对模型的修改来达到增,删,改操作
具体代码如下:
ZYWine文件
#import
/** 酒数据模型 */
@interface ZYWine : NSObject
/** 图片名 */
@property (nonatomic, copy) NSString *image;
/** 价格 */
@property (nonatomic, copy) NSString *money;
/** 酒名称 */
@property (nonatomic, copy) NSString *name;
@end
@implementation ZYWine
@end
ZYWineCell文件
#import
@class ZYWine;
// 每一个cell
@interface ZYWineCell : UITableViewCell
/** 酒的数据模型 */
@property(nonatomic,strong)ZYWine * wine;
@end
#import "ZYWine.h"
@implementation ZYWineCell
// 重写wine的set方法,把模型中的数据赋值进来
- (void)setWine:(ZYWine *)wine
{
_wine = wine;
self.imageView.image = [UIImage imageNamed:wine.image];
self.textLabel.text = wine.name;
self.detailTextLabel.text = [NSString stringWithFormat:@"¥%@",wine.money];
self.detailTextLabel.textColor = [UIColor orangeColor];
}
@end
Main.storyboard文件
ViewController文件
#import
@interface ViewController : UIViewController
@end
#import "MJExtension.h"
#import "ZYWineCell.h"
#import "ZYWine.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITableView *tableView;
/** 酒模型数组,装的都是酒模型 */
@property (strong,nonatomic) NSMutableArray *wineArray;
@end
@implementation ViewController
// 懒加载
- (NSMutableArray *)wineArray
{
if (!_wineArray) {
_wineArray = [ZYWine mj_objectArrayWithFilename:@"wine.plist"];
}
return _wineArray;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
#pragma -mark 按钮的点击方法
/**
以后想要修改tableView上面显示的数据,要通过模型去决定
*/
- (IBAction)addBtn {
//1. 修改模型
// 当点击添加按钮,增加一行cell
ZYWine *wine = [[ZYWine alloc] init];
wine.image = @"newWine";
wine.money = @"55.5";
wine.name = @"女儿红";
// 把这个酒模型添加到wineArray的第一个中
[self.wineArray insertObject:wine atIndex:0];
NSArray *indexPaths = @[
[NSIndexPath indexPathForRow:0 inSection:0]
];
[self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationRight];
}
- (IBAction)removeBtn {
// 因为每个cell的内容都是由模型(数据源)决定的
[self.wineArray removeObjectAtIndex:0];
// 刷新表格
NSArray *indexPaths = @[
[NSIndexPath indexPathForRow:0 inSection:0],
];
[self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationMiddle];
}
- (IBAction)updateBtn {
// 更新数据
ZYWine *wine = self.wineArray[0];
wine.money = @"100";
// 全局刷新
// [self.tableView reloadData];
/**
局部刷新: 只会刷新指定的那一行的cell
reloadRowsAtIndexPaths: 传递一个indexPaths的数组
withRowAnimation: 刷新动画
*/
NSArray *indexPaths = @[
[NSIndexPath indexPathForRow:0 inSection:0],
];
// 使用这个方法的前提: 包装模型数组中的个数不变,所以不可以使用这个方法进行增加和删除
[self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
}
#pragma -mark 实现数据源方法
/** 有多少行数据 */
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.wineArray.count;
}
/** 每一行数据的内容 */
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"cellForRowAtIndexPath--%ld",indexPath.row);
// 定义一个重用标识
static NSString *ID = @"wine";
ZYWineCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
// 判断缓存池中是否有可重用的cell,如果没有就创建
if (cell == nil) {
cell = [[ZYWineCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
}
// 设置每一行数据
cell.wine = self.wineArray[indexPath.row];
return cell;
}
@end
注意:
以后想要修改tableView上面显示的数据,要通过模型去决定,因为每个cell的内容都是由模型(数据源)决定的,不可以直接通过一些方法拿到cell来修改cell的内容,因为有循环利用,可能会导致数据紊乱