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

来源:互联网 发布:java培训骗局 编辑:程序博客网 时间:2024/04/26 04:05

做一个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 ()@endNSString *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