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"]) {
//从NavigationController到rootViewController的方法
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
浙公网安备 33010602011771号