源码-0205-02--表格数据的更新02

//  XMGDealsViewController.m
//  06-自定义等高cell01-storyboard
#import "XMGDealsViewController.h"
#import "XMGDeal.h"
#import "XMGDealCell.h"

@interface XMGDealsViewController () <UITableViewDataSource, UITableViewDelegate, UIAlertViewDelegate>
@property (weak, nonatomic) IBOutlet UITableView *tableView;
/** 所有的团购数据 */
@property (nonatomic, strong) NSMutableArray *deals;
@end

@implementation XMGDealsViewController

- (NSMutableArray *)deals
{
    if (_deals == nil) {
        // 加载plist中的字典数组
        NSString *path = [[NSBundle mainBundle] pathForResource:@"deals.plist" ofType:nil];
        NSArray *dictArray = [NSArray arrayWithContentsOfFile:path];

        // 字典数组 -> 模型数组
        NSMutableArray *dealArray = [NSMutableArray array];
        for (NSDictionary *dict in dictArray) {
            XMGDeal *deal = [XMGDeal dealWithDict:dict];
            [dealArray addObject:deal];
        }

        _deals = dealArray;
    }
    return _deals;
}

- (void)viewDidLoad {
    [super viewDidLoad];

}

- (IBAction)switchEditing {
    // 进入编辑模式
    [self.tableView setEditing:!self.tableView.isEditing animated:YES];
}

- (IBAction)add {
//    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"111" message:@"2222" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"好的", nil];
//
//    [alertView show];
//    UIActionSheet *sheet;

    // 创建弹框控制器
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"请输入团购信息" message:nil preferredStyle:UIAlertControllerStyleAlert];

    // 添加按钮
    [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
    [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {
        // 创建模型
        XMGDeal *deal = [[XMGDeal alloc] init];
        deal.title = [alert.textFields[0] text];
        deal.price = [alert.textFields[1] text];
        [self.deals insertObject:deal atIndex:0];

        // 刷新数据
        [self.tableView reloadData];
    }]];
//    [alert addAction:[UIAlertAction actionWithTitle:@"不知道" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
//        NSLog(@"点击了不知道按钮");
//    }]];
//    [alert addAction:[UIAlertAction actionWithTitle:@"不知道2" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
//        NSLog(@"点击了不知道2按钮");
//    }]];

    // 添加文本输入框
    [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
        textField.placeholder = @"请输入团购名字";
    }];
    [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
        textField.placeholder = @"请输入团购价格";
    }];

    // 显示控制器
    [self presentViewController:alert animated:YES completion:nil];
}

- (IBAction)remove {
    // 移除模型数据
    [self.deals removeObjectAtIndex:0];
    [self.deals removeObjectAtIndex:0];
    [self.deals removeObjectAtIndex:0];

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

- (IBAction)update {
    // 修改模型
    XMGDeal *deal = self.deals[3];
    deal.price = [NSString stringWithFormat:@"%d", 50 + arc4random_uniform(100)];;

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

#pragma mark - <UIAlertViewDelegate>
//- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
//{
//    NSLog(@"---%zd", buttonIndex);
//}

#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.deals.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    // 创建cell
    XMGDealCell *cell = [XMGDealCell cellWithTableView:tableView];

    // 取出模型数据
    cell.deal = self.deals[indexPath.row];

    return cell;
}

#pragma mark - TableView代理方法
/**
 * 只要实现这个方法,左划cell出现删除按钮的功能就有了
 * 用户提交了添加(点击了添加按钮)\删除(点击了删除按钮)操作时会调用
 */
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {  // 点击了“删除”
        // 删除模型
        [self.deals removeObjectAtIndex:indexPath.row];

        // 刷新表格
        [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
    } else if (editingStyle == UITableViewCellEditingStyleInsert) { // 点击了+
        NSLog(@"+++++ %zd", indexPath.row);
    }
}

/**
 * 这个方法决定了编辑模式时,每一行的编辑类型:insert(+按钮)、delete(-按钮)
 */
//- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
//{
//    return indexPath.row % 2 == 0? UITableViewCellEditingStyleInsert : UITableViewCellEditingStyleDelete;
//}
@end
时间: 2024-12-12 15:50:51

源码-0205-02--表格数据的更新02的相关文章

Spark Streaming源码解读之流数据不断接收全生命周期彻底研究和思考

本期内容 : 数据接收架构设计模式 数据接收源码彻底研究 一.Spark Streaming数据接收设计模式   Spark Streaming接收数据也相似MVC架构: 1. Mode相当于Receiver存储数据,C级别的,Receiver是个抽象因为他有好多的Receiver 2. ReceiverSupervisor 是控制器,因为Receiver启动是靠ReceiverSuperior启动的,及接收到的数据交给ReceiverSuperior存储数据的 3. Driver会获得源数据,

某课网 - Vue.js 源码全方位深入解析(同步更新)

第1章 准备工作介绍了 Flow.Vue.js 的源码目录设计.Vue.js 的源码构建方式,以及从入口开始分析了 Vue.js 的初始化过程. 1-1 课程简介1-2 准备工作1-3 认识 Flow-文档1-4 认识 Flow1-5 Vue.js 源码目录设计-文档1-6 Vue.js 源码目录设计1-7 Vue.js 源码构建-文档1-8 Vue.js 源码构建1-9 从入口开始-文档1-10 从入口开始 第2章 数据驱动详细讲解了模板数据到 DOM 渲染的过程,从 new Vue 开始,分

Vue.js 源码全方位深入解析(同步更新中)

第1章 准备工作介绍了 Flow.Vue.js 的源码目录设计.Vue.js 的源码构建方式,以及从入口开始分析了 Vue.js 的初始化过程. 1-1 课程简介1-2 准备工作1-3 认识 Flow-文档1-4 认识 Flow1-5 Vue.js 源码目录设计-文档1-6 Vue.js 源码目录设计1-7 Vue.js 源码构建-文档1-8 Vue.js 源码构建1-9 从入口开始-文档1-10 从入口开始第2章 数据驱动详细讲解了模板数据到 DOM 渲染的过程,从 new Vue 开始,分析

Vue.js 源码全方位深入解析(同步更新中)

第1章 准备工作介绍了 Flow.Vue.js 的源码目录设计.Vue.js 的源码构建方式,以及从入口开始分析了 Vue.js 的初始化过程. 1-1 课程简介1-2 准备工作1-3 认识 Flow-文档1-4 认识 Flow1-5 Vue.js 源码目录设计-文档1-6 Vue.js 源码目录设计1-7 Vue.js 源码构建-文档1-8 Vue.js 源码构建1-9 从入口开始-文档1-10 从入口开始第2章 数据驱动详细讲解了模板数据到 DOM 渲染的过程,从 new Vue 开始,分析

jquery源码解析:jQuery数据缓存机制详解1

jQuery中有三种添加数据的方法,$().attr(),$().prop(),$().data().但是前面两种是用来在元素上添加属性值的,只适合少量的数据,比如:title,class,name等.对于json这种数据量大的,就适合用data方法来添加,而data方法就是jQuery缓存机制最重要的方法. jQuery中为什么要用缓存机制系统呢?因为DOM元素与js对象之间互相引用,在大部分浏览器下会引起内存泄漏.为了解决这个问题,jQuery就写了一个缓存机制系统.举个例子: var di

(版本定制)第10课:Spark Streaming源码解读之流数据不断接收全生命周期彻底研究和思考

本期内容: 1.数据接收架构设计模式 2.数据接收源码彻底研究 1.Receiver接受数据的过程类似于MVC模式: Receiver,ReceiverSupervisor和Driver的关系相当于Model,Control,View,也就是MVC. Model就是Receiver,存储数据Control,就是ReceiverSupervisor,Driver是获得元数据,也就是View. 2.数据的位置信息会被封装到RDD里面. 3.Receiver接受数据,交给ReceiverSupervi

Spark发行版笔记10:Spark Streaming源码解读之流数据不断接收和全生命周期彻底研究和思考

本节的主要内容: 一.数据接受架构和设计模式 二.接受数据的源码解读 Spark Streaming不断持续的接收数据,具有Receiver的Spark 应用程序的考虑. Receiver和Driver在不同进程,Receiver接收数据后要不断给Deriver汇报. 因为Driver负责调度,Receiver接收的数据如果不汇报给Deriver,Deriver调度时不会把接收的数据计算入调度系统中(如:数据ID,Block分片). 思考Spark Streaming接收数据: 不断有循环器接收

POI导出大量数据的简单解决方案(附源码)-Java-POI导出大量数据,导出Excel文件,压缩ZIP(转载自iteye.com)

说明:我的电脑 2.0CPU 2G内存 能够十秒钟导出 20W 条数据 ,12.8M的excel内容压缩后2.68M 我们知道在POI导出Excel时,数据量大了,很容易导致内存溢出.由于Excel 一个sheet允许的最大行数是65536这时我们想到分sheet进行导出:但是这种情况也不能解决内存溢出的问题.毕竟数据还是一次性在内存中进行保存的.这时我们想是不是可以导出多个excel呢?下面我就尝试着按照导出多个excel 首先:我们要确定数据量有多大,然后确定一个excel导出多少条数据,这

关于网站使用异步请求以后浏览器源码查看不到数据导致百度抓取不到的问题解决方案

起初,也因为这个问题钻入了错误的漩涡中,比如js代码写在head里面,获取的数据用隐藏文本存放等等,试过以后都是不行的,后面甚至想到了改项目架构,但是自己都认为感觉有点不实际,改动那不是一般的大,对于在代码基本敲完只做优化的前提下任何人都是无法接受的,然后自己就琢磨怎么实现让网页源码能看到数据,后面就去比对网站,一般的网站想实现网页源码能看到数据肯定是要动态装载的,所有我想到了一个办法,而且特别简单,就是缓存,没有任何高端的技术,就是在你异步读取数据的时候,同步把数据装载进缓存里面,然后再放到页

Hadoop源码分析:HDFS数据读写流量控制(DataTransferThrottler类)

DataTransferThrottler类用于在Datanode读写数据时控制数据传输速率.这个类是线程安全的,可以被多个线程共享使用.使用方式是先构造DataTransferThrottler对象并设置周期period和带宽bandwidthPerSec,然后在数据实际读写前调用DataTransferThrottler.throttle()方法.如果I/O的速率相对给定的带宽太快,则该方法会将当前线程wait. 两个构造函数 双参构造函数,可以设置周期period和带宽bandwidthP