表格的编辑模式(删除、增加、移动)
- 预备步骤 一定要开启表视图的编辑状态 才会出现红色的删除、绿色的增加、灰色的移动操作图标
tableView.editing = YES; - 增加和删除的实现
两问一答
问一:该行是否开启编辑状态
问二:该行的编辑样式是什么,是绿色增加还是红色删除
答一:真的点击了红色删除动作后,如何响应
TRMyTableViewController.m
#import "TRMyTableViewController.h"
@interface TRMyTableViewController ()
@property(nonatomic,strong)NSMutableArray *array;
@end
@implementation TRMyTableViewController
-(NSArray *)array{
if(!_array){
_array =[@[@"北京",@"上海",@"广州",@"深圳"]mutableCopy];
}
return _array;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]
initWithTitle:@"编辑" style:UIBarButtonItemStylePlain
target:self action:@selector(edit:)];
//表视图控制器 自带UIBarButtonItem 用于表视图 编辑状态的切换
self.editButtonItem只是标识为因为Edit
//self.navigationItem.rightBarButtonItem =self.editButtonItem;
}
-(void)edit:(UIBarButtonItem*)sender{
//带动画从右边滑出
[self.tableView setEditing:!self.tableView.isEditing animated:YES];
sender.title = self.tableView.editing ? @"完成" : @"编辑";
}
//增加删除两问一答
//问一:该行是否能够编辑(如果不实现该代理方法,默认都可以编辑)
-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:
(NSIndexPath *)indexPath{
if(indexPath.row == 0)return NO;
return YES;
}
//问二:该行的编辑样式是什么,是绿色增加还是红色删除(默认是删除)
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView
editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
if(indexPath.row == self.array.count -1)
return UITableViewCellEditingStyleInsert;
return UITableViewCellEditingStyleDelete;
}
//答一:当真的编辑某行时 如何处理
-(void)tableView:(UITableView *)tableView commitEditingStyle:
(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath
(NSIndexPath *)indexPath{
if(editingStyle == UITableViewCellEditingStyleDelete){
//删除
//从数组删除 对应位置的元素(即当前位置的元素)
[self.array removeObjectAtIndex:indexPath.row];
//刷新tableView
// [self.tableView reloadData];
[self.tableView deleteRowsAtIndexPaths:@[indexPath]
withRowAnimation:UITableViewRowAnimationRight];
}else if (editingStyle == UITableViewCellEditingStyleInsert){
//插入
//[self.array addObject:@"南京"];(默认尾部插入)
[self.array insertObject:@"南京" atIndex:0];
// [self.tableView reloadData];
NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView insertRowsAtIndexPaths:@[path]
withRowAnimation:UITableViewRowAnimationLeft];
}
}
/移动的一问一答
//问 当前行是否可以移动
-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:
(NSIndexPath *)indexPath{
return YES;
}
//答 移动后如何处理
-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:
(NSIndexPath *)sourceIndexPath toIndexPath:
(NSIndexPath *)destinationIndexPath{
//把 原位置的 元素 取出, 把该元素从数组中移除
NSString *string = self.array[sourceIndexPath.row];
[self.array removeObjectAtIndex:sourceIndexPath.row];
//把取出的元素 在插入到 目标位置
[self.array insertObject:string atIndex:destinationIndexPath.row];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
return self.array.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:@"reuseIdentifier"];
if(!cell){
cell = [[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"reuseIdentifier"];
}
cell.textLabel.text = self.array[indexPath.row];
return cell;
}
-
效果如下:
image.png
自定义单元格时单元格重用的几种写法
组合1:xib文件+重用的写法一
step1:创建cell类时勾选xib文件
step2:设计xib文件的内容,注意不要向空白处多拖拽处不用的控件
step3:将xib中的控件连线到h文件
step4:一定要在xib中,选中单元格,设置第4个检查器中的identifier属性,即添加
//添加导航控制器上面添加按键navigationItem并添加到下个界面的事件方法
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self
action:@selector(gotoAddVC:)];}
-(void)gotoAddVC:(UIBarButtonItem*)sender{
TRAddViewController *addVC = [[TRAddViewController alloc]init];
[self.navigationController pushViewController:addVC animated:YES];
}
注意:当跳转到下个界面卡的时候可以个界面添加背景颜色
self.view.backgroundColor = [UIColor whiteColor];
如下图所示添加了一个跳转到下个界面的加号键
自己单独创建xib
-
1)创建
image.png -
2)关联所要绑定的类(控制器对象)和视图
image.png -
3)
image.png -
4)
image.png - 5)
TRAddViewController.h(委托协议delegate)将城市对象传回到前面界面(注意:委托协议添加属性要用weak如@property(nonatomic,weak)id<TRAddViewControllerDelegate>delegate;
)
#import <UIKit/UIKit.h>
#import "City.h"
NS_ASSUME_NONNULL_BEGIN
@class TRAddViewController;
@protocol TRAddViewControllerDelegate <NSObject>
-(void)TRAddViewController:(TRAddViewController*)addVC didFinishAddWithCity:(City*)newCity;
@end
@interface TRAddViewController : UIViewController
@property(nonatomic,weak)id<TRAddViewControllerDelegate>delegate;
@end
TRAddViewController.m
#import "TRAddViewController.h"
#import "City.h"
@interface TRAddViewController ()
@property (weak, nonatomic) IBOutlet UITextField *nameField;
@property (weak, nonatomic) IBOutlet UITextField *populationField;
@property (weak, nonatomic) IBOutlet UITextField *imageNameField;
@end
@implementation TRAddViewController
- (IBAction)addCityButtonClick:(id)sender {
//创建新的城市对象
City *newCity = [[City alloc]init];
newCity.name = self.nameField.text;
newCity.population = [self.populationField.text integerValue];
newCity.imageName = self.imageNameField.text;
//将城市对象传回到前面界面
[self.delegate TRAddViewController:self didFinishAddWithCity:newCity];
//跳转到前面界面
[self.navigationController popViewControllerAnimated:YES];
}
MyTableViewController.m
#import "TRAddViewController.h"
@interface MyTableViewController ()<TRAddViewControllerDelegate>
@property(nonatomic,strong)NSMutableArray *array;
@end
@implementation MyTableViewController
-(NSArray *)array{
if(!_array){
//_array = [NSMutableArray arrayWithArray:[DataManager allData]];
//mutableCopy 拷贝可变数组
_array = [[DataManager allData] mutableCopy];
}
return _array;
}
//代理协议的 代理方法
-(void)TRAddViewController:(TRAddViewController *)addVC didFinishAddWithCity:(City *)newCity{
//将新城市添加到数组中
[self.array addObject:newCity];
// //刷新tableView让三问重新加载 reloadData会把前面的内容一起重新显示一遍
// [self.tableView reloadData];
//必须 先把数据添加到数组中 数据中是什么位置,这里插入的是哪行(或者创建动画效果)
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.array.count-1 inSection:0];
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
}
- (void)viewDidLoad {
[super viewDidLoad];
//添加导航控制器上面添加按键navigationItem
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(gotoAddVC:)];
}
-(void)gotoAddVC:(UIBarButtonItem*)sender{
TRAddViewController *addVC = [[TRAddViewController alloc]init];
addVC.delegate = self;
[self.navigationController pushViewController:addVC animated:YES];
}
今天学了新的知识点* 1)mutableCopy 拷贝可变数组。
- 2)reloadData重新加载tableView。
- 3)insertRowsAtIndexPaths将数据插入数组中。
用block传值实现上面委托协议的方法
.h/
typedef void (^BLOCK)(City*);
@interface TRAddViewController : UIViewController
//类(属性名)型
//@property(nonatomic,strong)void(^block)(City*);
//block 第二件事 声明一个block属性
@property(nonatomic,strong)BLOCK block;
@end
.m/
//block 第三件事 调用block进行传值
self.block(newCity);
.m/返将城市界面传回
-(void)gotoAddVC:(UIBarButtonItem*)sender{
TRAddViewController *addVC = [[TRAddViewController alloc]init];
//addVC.delegate = self;
//给addVC的block属性赋值
addVC.block = ^(City * newCity){
//代码块
[self.array addObject:newCity];
[self.tableView reloadData];
};
[self.navigationController pushViewController:addVC animated:YES];
}
网友评论