[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
- [IOS]包含增删改查移动的tableView展示+plist文件保存+程序意外退出保存Demo
- iOS plist文件的增删查改
- iOS开发-plist文件增删改查
- iOS开发-plist文件增删改查
- iOS Plist文件,增删改查
- plist 文件的增删改查 例子
- plist文件的增删改查
- iOS--对plist文件进行读写,增删改查
- Handsontable 的数据保存(增删改查+导出excel)
- Handsontable 的数据保存(增删改查+导出excel)
- 术语的增删改保存
- iOS使用读写plist文件方式对数据进行增删改查
- plist文件的形式保存在本地程序沙盒中
- iOS操作属性列表plist(增删改查)
- iOS操作属性列表plist(增删改查)
- iOS 沙盒保存plist文件
- java解析xml文件:创建、读取、遍历、增删查改、保存
- NSFileManager的使用保存图片,并进行增删查改,还进入部分插入
- API相关工作的个人总结_Sandcastle简要使用介绍
- Android学习系列-把文件保存到SD卡上面(6)
- HDU4514(非连通图的环判断与图中最长链)
- one of the key features of distributed application-managemeability
- opencv之绘图
- [IOS]包含增删改查移动的tableView展示+plist文件保存+程序意外退出保存Demo
- wikioi p1169 传纸条
- PHP 文件上传后台处理脚本
- POJ 3126 / Northwestern Europe 2006 Prime Path (数论&BFS)
- Android Activity Manifest 标签
- linux grep
- 《编程之美》2.21 只考加法的面试题
- LeetCode - Climbing Stairs
- C++模板类的继承2:普通类继承模板类