A.需求
1.以LOL英雄列表为蓝本,给其加上实时修改英雄名称的功能
2.使用UIAlertView
3.全局刷新reloadData
4.局部刷新
B.实现
1.使用UIAlertView
// 弹窗
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"修改英雄名称" message:nil delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
2.全局刷新reloadData
// 刷新数据
// 1.全局刷新
// 1.全局刷新
[self.tableView reloadData];
3.局部刷新
// 2.局部刷新
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:alertView.tag inSection:0];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:alertView.tag inSection:0];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
C.主要代码
1 // 2 // Hero.h 3 // LOLHero 4 // 5 // Created by hellovoidworld on 14/12/1. 6 // Copyright (c) 2014年 hellovoidworld. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 @interface Hero : NSObject 12 13 @property(nonatomic, copy) NSString *icon; 14 @property(nonatomic, copy) NSString *intro; 15 @property(nonatomic, copy) NSString *name; 16 17 - (instancetype) initWithDictionary:(NSDictionary *) dictionary; 18 + (instancetype) heroWithDictionary:(NSDictionary *) dictionary; 19 + (instancetype) hero; 20 21 @end
1 // 2 // Hero.m 3 // LOLHero 4 // 5 // Created by hellovoidworld on 14/12/1. 6 // Copyright (c) 2014年 hellovoidworld. All rights reserved. 7 // 8 9 #import "Hero.h" 10 11 @implementation Hero 12 13 - (instancetype) initWithDictionary:(NSDictionary *) dictionary { 14 if (self = [super init]) { 15 // self.icon = dictionary[@"icon"]; 16 // self.intro = dictionary[@"intro"]; 17 // self.name = dictionary[@"name"]; 18 // 代替上方代码, 使用KVC 19 [self setValuesForKeysWithDictionary:dictionary]; 20 } 21 22 return self; 23 } 24 25 + (instancetype) heroWithDictionary:(NSDictionary *) dictionary { 26 return [[self alloc] initWithDictionary:dictionary]; 27 } 28 29 + (instancetype) hero { 30 return [self heroWithDictionary:nil]; 31 } 32 33 @end
1 // 2 // ViewController.m 3 // LOLHero 4 // 5 // Created by hellovoidworld on 14/12/1. 6 // Copyright (c) 2014年 hellovoidworld. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 #import "Hero.h" 11 12 // 遵守了UITableViewDelegate才能响应行点击事件, 遵守UIAlertViewDelegate处理弹窗的事件 13 @interface ViewController () <UITableViewDataSource, UITableViewDelegate, UIAlertViewDelegate> 14 15 // UITableView 16 @property (weak, nonatomic) IBOutlet UITableView *tableView; 17 18 // 所有hero资料 19 @property(nonatomic, strong) NSArray *heros; 20 21 @end 22 23 @implementation ViewController 24 25 - (void)viewDidLoad { 26 [super viewDidLoad]; 27 // Do any additional setup after loading the view, typically from a nib. 28 29 // 设置dataSource 30 self.tableView.dataSource = self; 31 32 // 设置行高 33 self.tableView.rowHeight = 60; 34 35 // 设置delegate 36 self.tableView.delegate = self; 37 } 38 39 - (void)didReceiveMemoryWarning { 40 [super didReceiveMemoryWarning]; 41 // Dispose of any resources that can be recreated. 42 } 43 44 /** 隐藏状态栏 */ 45 - (BOOL)prefersStatusBarHidden { 46 return YES; 47 } 48 49 /** 延迟加载hero数据 */ 50 - (NSArray *) heros { 51 if (nil == _heros) { 52 NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"heros.plist" ofType:nil]]; 53 54 NSMutableArray *herosArray = [NSMutableArray array]; 55 for (NSDictionary *dict in dictArray) { 56 Hero *hero = [Hero heroWithDictionary:dict]; 57 [herosArray addObject:hero]; 58 } 59 60 _heros = herosArray; 61 } 62 63 return _heros; 64 } 65 66 #pragma mark - 列表方法 67 68 // section数, 默认是1 69 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 70 return 1; 71 } 72 73 // 特定section的行数 74 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 75 return self.heros.count; 76 } 77 78 79 // 特定行的内容 80 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 81 Hero *hero = self.heros[indexPath.row]; 82 83 // 使用static修饰局部变量,能保证只分配一次存储空间 84 static NSString *hereCellId = @"hero"; 85 86 // 使用特定标识符, 从缓存池查看时候有适合的cell存在 87 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:hereCellId]; 88 89 if (nil == cell) { 90 // 创建的时候指定标识符 91 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:hereCellId]; 92 } 93 94 // 标题 95 cell.textLabel.text = hero.name; 96 97 // 副标题 98 cell.detailTextLabel.text = hero.intro; 99 100 // 图标 101 cell.imageView.image = [UIImage imageNamed:hero.icon]; 102 103 return cell; 104 } 105 106 #pragma mark - 响应事件 107 108 /** 点击选中某行 */ 109 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 110 // 取得model 111 Hero *hero = self.heros[indexPath.row]; 112 113 // 弹窗 114 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"修改英雄名称" message:nil delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil]; 115 116 // 设置delegate,也可以在init方法中指定 117 alertView.delegate = self; 118 119 // 设置弹窗样式 120 alertView.alertViewStyle = UIAlertViewStylePlainTextInput; 121 122 // 设置弹窗输入框内容 123 [alertView textFieldAtIndex:0].text = hero.name; 124 125 // 保存index 126 alertView.tag = indexPath.row; 127 128 // 显示弹窗 129 [alertView show]; 130 } 131 132 /** 处理弹窗点击“确定”按钮事件 */ 133 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 134 // 取消 135 if (0 == buttonIndex) return; 136 137 // 确定 138 // 保存新的名字到model 139 Hero *hero = self.heros[alertView.tag]; 140 hero.name = [alertView textFieldAtIndex:0].text; 141 142 // 刷新数据 143 // 1.全局刷新 144 // [self.tableView reloadData]; 145 146 // 2.局部刷新 147 NSIndexPath *indexPath = [NSIndexPath indexPathForRow:alertView.tag inSection:0]; 148 [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight]; 149 150 } 151 152 @end