美文网首页
ios表视图控制器2

ios表视图控制器2

作者: 我不白先生 | 来源:发表于2020-10-22 21:16 被阅读0次

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

    • 预备步骤 一定要开启表视图的编辑状态 才会出现红色的删除、绿色的增加、灰色的移动操作图标
      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];
    }
    

    相关文章

      网友评论

          本文标题:ios表视图控制器2

          本文链接:https://www.haomeiwen.com/subject/fkkemktx.html