ios表视图控制器2

2020-10-22  本文已影响0人  我不白先生

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

#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;
}

自定义单元格时单元格重用的几种写法
组合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

#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 拷贝可变数组。

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];
}
上一篇下一篇

猜你喜欢

热点阅读