zoukankan      html  css  js  c++  java
  • [IOS]包含增删改查移动的tableView展示+plist文件保存+程序意外退出保存Demo

    做一个tableView,包含增删改移动功能,并且修改值的时候,在按home键的时候会自动保存。如果可以的话使者保存自定义的类数组保存到plist中。

    实现步骤:

    1.创建一个SingleViewApplication的项目,首页命名为FirstViewController


    FirstViewController.h:

    #import <UIKit/UIKit.h>
    
    @interface FirstViewController : UITableViewController
    @property(nonatomic,retain) NSMutableArray *array;
    @end

    FirstViewController.m:

    #import "FirstViewController.h"
    #import "DXWViewController.h"
    @interface FirstViewController ()
    
    @end
    NSString *CellIdentifier = @"Cell";
    
    @implementation FirstViewController
    
    - (id)initWithStyle:(UITableViewStyle)style
    {
        self = [super initWithStyle:style];
        if (self) {
            self.array = @[
                           [[DXWViewController alloc] initWithStyle:UITableViewStylePlain]];
            self.title = @"目录列表";
        }
        return self;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:CellIdentifier];
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    #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
    {
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
        
        int row = [indexPath row];
        cell.textLabel.text = ((DXWViewController *)self.array[row]).title;
        //有右边的>符号
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        return cell;
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        int row = [indexPath row];
        [self.navigationController pushViewController:self.array[row] animated:YES];
    }
    
    @end

    2.创建二级子视图控制器,不带xib文件,命名DXWViewController


    DXWViewController.h:

    #import <UIKit/UIKit.h>
    
    @protocol change <NSObject>
    
    -(void)changeData:(int)row Name:(NSString *)name;
    
    @end
    
    @interface DXWViewController : UITableViewController<UIAlertViewDelegate>
    @property(nonatomic,retain)NSMutableArray *array;
    @property(retain,nonatomic)NSIndexPath *indexPath;
    @end

    DXWViewController.m:

    #import "DXWViewController.h"
    #import "EditViewController.h"
    BOOL RIGHTBUTTON;
    @interface DXWViewController ()
    
    @end
    
    @implementation DXWViewController
    
    //获取沙盒文件路径
    
    -(NSString *)getPath
    
    {
        
        //用来获得Document地址
        
        NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);//注意:这里是NSDocument不是NSDocumentation,特别注意
        
        NSLog(@"%@",arr);
        
        //在地址上增加文件
        
        NSString *path = [arr[0] stringByAppendingPathComponent:@"abc.plist"];
        
        NSLog(@"%@",path);
        
        return path;
        
    }
    
    -(BOOL)writeDataToFile:(NSString *)path DataSource:(NSMutableArray *)array
    {
        return [array writeToFile:path atomically:YES];
    }
    
    -(NSMutableArray *)getDataFromFile:(NSString *)path
    {
        //判断是否有文件
        
        if([[NSFileManager defaultManager] fileExistsAtPath:[self getPath]])
            
        {
            
            NSMutableArray *arr = [NSArray arrayWithContentsOfFile:[self getPath]];
            
            return arr;
            
        }
    }
    
    - (id)initWithStyle:(UITableViewStyle)style
    {
        self = [super initWithStyle:style];
        if (self)
        {
            self.title = @"子视图";
    //        NSArray *arr = @[@"返回上一级",@"小花",@"小李",@"小王",@"小丁",@"小张",@"小康",@"小刘",@"小墩",@"大墩"];
    //        self.array = [arr mutableCopy];
    //        if ([self writeDataToFile:[self getPath] DataSource:self.array]) {
    //            NSLog(@"success");
    //        }
            //获取数据
            self.array = [self getDataFromFile:[self getPath]];
        }
        return self;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        //首先要添加右上角的一个edit按钮,按钮按下去可以设置可以编辑
        UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithTitle:@"添加" style:UIBarButtonItemStyleBordered target:self action:@selector(itemLeftButtonClick:)];
    	self.navigationItem.leftBarButtonItem = button;
        
        UIBarButtonItem *button1 = [[UIBarButtonItem alloc] initWithTitle:@"删除" style:UIBarButtonItemStyleBordered target:self action:@selector(itemRightButtonClick:)];
        self.navigationItem.rightBarButtonItem = button1;
    }
    
    
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [self.array count];
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *identifier = @"Identifier";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
        if (cell == nil)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
        }
        int row = [indexPath row];
        cell.textLabel.text = self.array[row];
        return cell;
    }
    
    -(void)itemLeftButtonClick:(id)sender
    {
        
        //设置可以编辑
        RIGHTBUTTON = false;
        [self.tableView setEditing:!self.tableView.editing];//设置成和当前状态相反的状态
        if (self.tableView.editing)
        {
            [self.navigationItem.leftBarButtonItem setTitle:@"完成"];
        }
        else
        {
            [self.navigationItem.leftBarButtonItem setTitle:@"添加"];
        }
    }
    
    -(void)itemRightButtonClick:(id)sender
    {
        RIGHTBUTTON = true;
        //设置可以编辑
        [self.tableView setEditing:!self.tableView.editing];//设置成和当前状态相反的状态
        if (self.tableView.editing)
        {
            [self.navigationItem.rightBarButtonItem setTitle:@"完成"];
        }
        else
        {
            [self.navigationItem.rightBarButtonItem setTitle:@"删除"];
        }
    }
    
    //设置编译图标
    -(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        //删除
        if (RIGHTBUTTON)
        {
            return UITableViewCellEditingStyleDelete;
        }
        else
        {
            return UITableViewCellEditingStyleInsert;
            //return UITableViewCellEditingStyleNone;
        }
    }
    //设置是否可以移动
    -(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (RIGHTBUTTON)
        {
            return NO;
        }
        else
        {
            if (indexPath != 0) {
                return YES;
            }
        }
    }
    
    -(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if ([indexPath row] == 0) {
            return NO;
        }
        else
        {
            return YES;
        }
    }
    
    //实现UIAlertView代理协议
    -(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
    {
        //获取AlertView中的数据
        NSString *str = [alertView textFieldAtIndex:0].text;
        //将数据插入到array数组中(位置是点击的位置的下一行)
        [self.array insertObject:str atIndex:[self.indexPath row]+1];
        //用点击位置的下一行创建一个新的NSIndexPath
        int newrow = [self.indexPath row]+1;
        NSIndexPath *index = [NSIndexPath indexPathForRow:newrow inSection:0];
        //在tableView的这个NSIndexPath中插入数据
        [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:index] withRowAnimation: UITableViewRowAnimationFade];
        [self writeDataToFile:[self getPath] DataSource:self.array];
    }
    
    
    -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        //删除按钮
        if (RIGHTBUTTON) {
            if ([indexPath row] != 0)
            {
                int row = [indexPath row];
                [self.array removeObjectAtIndex:row];
                [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationMiddle];
                [self writeDataToFile:[self getPath] DataSource:self.array];
            }
        }
        //添加按钮
        else
        {
            //获得点击的indexPath
            self.indexPath = indexPath;
            //创建一个UIAlertView,用来获得数据
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"enterstring" message:nil delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil];
            //带有输入框的UIAlertView
            alert.alertViewStyle = UIAlertViewStylePlainTextInput;
            [alert show];
        }
    }
    
    
    //可以根据行来设置delete按钮位置上button的标题
    -(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return @"你删我一个试试";
    }
    
    -(void)dealloc
    {
        [self.array release];
        [self.indexPath release];
        [super dealloc];
    }
    
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if ([indexPath row] == 0)
        {
            [self.navigationController popToRootViewControllerAnimated:YES];
        }
        else
        {
            EditViewController *edit = [[EditViewController alloc] init];
            edit.sname = self.array[[indexPath row]];
            edit.row = indexPath.row;
            edit.delegate = self;
            [self.navigationController  pushViewController:edit animated:YES];
        }
        //蓝色背景消失
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
        
    -(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
    {
        if (!RIGHTBUTTON) {
            if ([destinationIndexPath row]!=0) {
                id object= self.array[[sourceIndexPath row]];
                [self.array removeObject:self.array[[sourceIndexPath row]]];
                [self.array insertObject:object atIndex:[destinationIndexPath row]];
                NSLog(@"%d",[self.array count]);
                NSLog(@"当前位置%d,目标位置%d",[sourceIndexPath row],[destinationIndexPath row]);
                [self writeDataToFile:[self getPath] DataSource:self.array];
            }
            //如果是跟第一行移动,则不允许这样操作,重新加载数据
            [self.tableView reloadData];
        }
    }
    
    //实现遵循协议的方法
    -(void)changeData:(int)row Name:(NSString *)name
    {
        [self.array replaceObjectAtIndex:row withObject:name];
        [self writeDataToFile:[self getPath] DataSource:self.array];
        [self.tableView reloadData];
    }
    @end


    3.创建一个可以修改的viewController With xib,命名为:EditViewController


    EditViewController.h:

    #import <UIKit/UIKit.h>
    #import "DXWViewController.h"
    @interface EditViewController : UIViewController
    @property (retain, nonatomic) IBOutlet UITextField *name;
    @property(retain,nonatomic)NSString *sname;
    @property(assign,nonatomic) int row;
    - (IBAction)assignBoardClick:(id)sender;
    @property(nonatomic,retain)id<change>delegate;
    @end

    EditViewController.m:

    #import "EditViewController.h"
    #import "DXWViewController.h"
    @interface EditViewController ()
    
    @end
    
    @implementation EditViewController
    //获取沙盒文件路径
    
    -(NSString *)getPath
    
    {
        
        //用来获得Document地址
        
        NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);//注意:这里是NSDocument不是NSDocumentation,特别注意
        
        NSLog(@"%@",arr);
        
        //在地址上增加文件
        
        NSString *path = [arr[0] stringByAppendingPathComponent:@"abc.plist"];
        
        NSLog(@"%@",path);
        
        return path;
        
    }
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            self.title = @"信息修改";
        }
        return self;
    }
    
    -(void)viewWillAppear:(BOOL)animated
    {
        self.name.text = self.sname;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        //首先要添加右上角的一个edit按钮,按钮按下去可以设置可以编辑
        UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleBordered target:self action:@selector(itemLeftButtonClick:)];
        //左按钮返回
    	self.navigationItem.leftBarButtonItem = button;
        //右按钮编辑保存并返回
        UIBarButtonItem *button1 = [[UIBarButtonItem alloc] initWithTitle:@"保存" style:UIBarButtonItemStyleBordered target:self action:@selector(itemRightButtonClick:)];
        self.navigationItem.rightBarButtonItem = button1;
        
        //实现不按保存按钮也能够保存到文件的功能,获取应用
        UIApplication *app = [UIApplication sharedApplication];
        //在通知中心添加一个观察者,当符合UIApplicationWillResignActiveNotification条件时,调用方法
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(save:) name:UIApplicationWillResignActiveNotification object:app];
    }
    
    -(void)save:(id)sender
    {
        self.sname = self.name.text;
        if ([self.delegate respondsToSelector:@selector(changeData:Name:)]) {
            [self.delegate changeData:self.row Name:self.sname];
        }
    }
    
    //返回
    -(void)itemLeftButtonClick:(id)sender
    {
        [self.navigationController popViewControllerAnimated:YES];
    }
    //保存
    -(void)itemRightButtonClick:(id)sender
    {
        [self changedata];
        [self.navigationController popViewControllerAnimated:YES];
    }
    
    - (void)changedata
    {
        self.sname = self.name.text;
        if ([self.delegate respondsToSelector:@selector(changeData:Name:)]) {
            [self.delegate changeData:self.row Name:self.sname];
        }
    }
    
    - (IBAction)assignBoardClick:(id)sender
    {
        [sender resignFirstResponder];
    }
    
    - (void)dealloc {
        [_name release];
        [super dealloc];
    }
    @end



    demo源文件:

    http://download.csdn.net/detail/s10141303/6008305


  • 相关阅读:
    spring boot集成redis和mongodb实现计步排名
    spring boot + redis 实现网站限流和接口防刷功能
    基于spring-boot-data-jdbc的RowMapper实例的初始化配置,配置内容和实体类的代码由测试类生成
    自定义注解并封装成jar包,实现一般方法和Controller类的入参、出参和执行时间的日志打印
    封装自己的spring-boot-starter实现初始化字典数据和脱敏(windows10+jdk8+idea+spring-boot2.1.5)
    spring boot 集成mybatis的多数据源
    常用工具说明--jsdoc 前端文档输出工具
    常用工具说明--mysql数据库安装
    web前端--实现前后端分离的心得
    资料汇总--Ajax中Put和Delete请求传递参数无效的解决方法(Restful风格)【转】
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3281205.html
Copyright © 2011-2022 走看看