UI 一一 数据刷新

效果图如下:



先介绍一下数据刷新:

数据刷新

  • 添加数据
  • 删除数据
  • 更改数据

全局刷新方法(最常用)

[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 <Foundation/Foundation.h>

/** 酒数据模型 */
@interface ZYWine : NSObject

/** 图片名 */
@property (nonatomic, copy) NSString *image;

/** 价格 */
@property (nonatomic, copy) NSString *money;

/** 酒名称 */
@property (nonatomic, copy) NSString *name;

@end


@implementation ZYWine

@end

ZYWineCell文件
#import <UIKit/UIKit.h>
@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 <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end

#import "MJExtension.h"
#import "ZYWineCell.h"
#import "ZYWine.h"

@interface ViewController () <UITableViewDataSource>
@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的内容,因为有循环利用,可能会导致数据紊乱





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

white camel

感谢支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值