[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


优质内容筛选与推荐>>
1、OpenCV对轮廓的绘图与筛选操作总结
2、我爬了链家青岛市北3000套二手房得出一个结论
3、栈(Stack源码分析)
4、win8快捷键大全分享,非常全
5、Hadoop学习1--解决启动过程中的问题


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号