ios表视图控制器2

表格的编辑模式(删除、增加、移动)

  • 预备步骤 一定要开启表视图的编辑状态 才会出现红色的删除、绿色的增加、灰色的移动操作图标
    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];
如下图所示添加了一个跳转到下个界面的加号键

302CE5A5-F8AD-4D67-B130-3638816EC266.png

自己单独创建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];
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272