MasterView和DetailView同时实现新增数据

表视图中经常使用MaterView和DetailView查看数据,但是在需要新增数据的时候,我之前的做法是,增加一个视图比如叫AddView之类的,用三个视图实现数据的传递和显示。但是在数据多的时候,需要增加很多个视图,觉得可能对速度有影响,而且在Storyboard里面看起来也越来越多,最好是通过两个视图控制器就能实现数据的添加和显示。研究了一下,实现如下:

1.在模版文件中新增加一个Navigation Controller,root view controller是Detai View controller;

2.新增指向Navigation Controller,Modal模式,分别设置不同的segue identifer

3.Detail view controller增加uibuttonItem,比如说是save,用于保存新增数据,连接Exit到Master View Controller的Done

4.UI上做调整,新增数据的时候显示UITextField,查看数据的时候显示UILabel,而且名称UILable也要做相应的变动,在查看模式下Save不显示

5.做好连接后,根据不同的segue identifer设置数据传递。

 

完成后代码如下:

 

Master View Controller:

#import "TMasterViewController.h"

 

#import "TDetailViewController.h"

 

@interfaceTMasterViewController () {

    NSMutableArray *_list;

}

@end

 

@implementation TMasterViewController

 

 

- (void)viewDidLoad

{

    [superviewDidLoad];

    self.navigationItem.leftBarButtonItem = self.editButtonItem;    

    _list = [[NSMutableArray alloc] init];

    [_list addObject:@"test1"];

}

 #pragma mark - Table View

 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{

    return 1;

}

 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

    return _list.count;

}

 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"forIndexPath:indexPath];

    cell.textLabel.text = [_list objectAtIndex:indexPath.row];

    return cell;

}

 

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath

{

    // Return NO if you do not want the specified item to be editable.

    returnYES;

}

 

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

{

    if (editingStyle == UITableViewCellEditingStyleDelete) {

        [_list removeObjectAtIndex:indexPath.row];

        [tableView deleteRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationFade];

    } elseif (editingStyle == UITableViewCellEditingStyleInsert) {

        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.

    }

}

 

 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

{

    if ([[segue identifier] isEqualToString:@"ShowDetail"]) {

        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

        

        TDetailViewController *detailVC1 = [segue destinationViewController];

        detailVC1.detailLabelHidden = NO;

        detailVC1.toAddString = [_list objectAtIndex:indexPath.row];

        detailVC1.detailTxFdHidden = YES;

        detailVC1.saveHidden = YES;

        

    }

    if ([[segue identifier] isEqualToString:@"ToAdd"]) {

        //NavigationControllerrootViewController的方法

        

        UINavigationController *naviController = [segue destinationViewController];

        TDetailViewController *detailVC = [naviController.viewControllers objectAtIndex:0];

        

        detailVC.detailLabelHidden = YES;

        //不能在这里进行detailVC.nameLabel.text复制,只能对属性赋值

        detailVC.detailTxFdHidden = NO;

        detailVC.saveHidden = NO;

        

    }

    

}

 

-(IBAction) done:(UIStoryboardSegue *) segue;{

    

    if ([[segue identifier] isEqualToString:@"WillAdd"]) {

        TDetailViewController *detailVC2 = [segue sourceViewController];

        [_list addObject:detailVC2.toAddString];

        [self.tableView reloadData];

     }

}

 @end

 

Detail View Controller :

 

#import "TDetailViewController.h"

#import "TMasterViewController.h"

 

@interfaceTDetailViewController ()

 

@end

 

@implementation TDetailViewController

 

#pragma mark - Managing the detail item

 

- (void)viewDidLoad

{

    [superviewDidLoad];

    _detailLabel.hidden = _detailLabelHidden;

    _detailTxFd.hidden = _detailTxFdHidden;

    

    if (_saveHidden){

        self.navigationItem.rightBarButtonItem = nil;

        _detailLabel.text = _toAddString;

    }

    else

        _nameLabel.text = @"Please Input Name:";

  }

 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

    

    _toAddString = _detailTxFd.text;

  }

@end

 

 

 

posted @ 2014-01-07 20:09  sanbaodou  阅读(397)  评论(0)    收藏  举报