詳細的單元格包含很多控件,並且數據更加複雜,需要一個自定義Object-c 數據對象存放將在列表中顯示的各個實例。
一個自定義Object-c 數據對象一個是父視圖和子視圖
#import <Foundation/Foundation.h>
#define kPresidentNumberKey @"President"
#define kPresidentNameKey @"Name"
#define kPresidentFromKey @"FromYear"
#define kPresidentToKey @"ToYear"
#define kPresidentPartyKey @"Party"
@interface BIDPresident :NSObject<NSCoding>
@property int number;
@property (nonatomic,copy)NSString *name;
@property (nonatomic,copy)NSString *fromYear;
@property (nonatomic,copy)NSString *toYear;
@property (nonatomic,copy)NSString *party;
@end
#import "BIDPresident.h"
@implementation BIDPresident
@synthesize number;
@synthesize name;
@synthesize fromYear;
@synthesize toYear;
@synthesize party;
#pragma mark -
#pragma mark NSCoding
-(void)encodeWithCoder:(NSCoder *)Coder
{
[Coder encodeInt:self.numberforKey:kPresidentNumberKey];
[Coder encodeObject:self.nameforKey:kPresidentNameKey];
[Coder encodeObject:self.fromYearforKey:kPresidentFromKey];
[Coder encodeObject:self.toYearforKey:kPresidentToKey];
[Coder encodeObject:self.partyforKey:kPresidentPartyKey];
}
-(id)initWithCoder:(NSCoder *)coder
{
if (self=[superinit]) {
number=[coderdecodeIntForKey:kPresidentNumberKey];
name=[coderdecodeObjectForKey:kPresidentNameKey];
fromYear =[coderdecodeObjectForKey:kPresidentFromKey];
toYear =[coderdecodeObjectForKey:kPresidentToKey];
party =[coderdecodeObjectForKey:kPresidentPartyKey];
}
return self;
}
@end
父視圖
#import "BIDSecondLevelViewController.h"
@interface BIDPresidentsViewController :BIDSecondLevelViewController
@property (strong,nonatomic)NSMutableArray *list;
@end
#import "BIDPresidentsViewController.h"
#import "BIDPresidentDetailController.h"
#import "BIDPresident.h"
@implementation BIDPresidentsViewController
@synthesize list;
-(void)viewDidLoad
{
[superviewDidLoad];
NSString *path=[[NSBundlemainBundle]pathForResource:@"Presidents"ofType:@"plist"];
NSData *data;
NSKeyedUnarchiver *unarchiver;
//對象存放臨時編碼初始化後並存放到數組中
data =[[NSDataalloc]initWithContentsOfFile:path];
unarchiver= [[NSKeyedUnarchiveralloc]initForReadingWithData:data];
NSMutableArray *array = [unarchiverdecodeObjectForKey:@"Presidents"];
self.list =array;
[unarchiverfinishDecoding];
}
-(void)viewWillAppear:(BOOL)animated
{
//當用戶更改了詳細信息視圖中的內容,爲了確保父視圖重新加載這些新數據。只是做了強制重新加載。
[superviewWillAppear:animated];
[self.tableViewreloadData];
}
#pragma mark -
#pragma mark Table Data Source Methods
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [listcount];
}
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
staticNSString *PresidentListCellIdentifier=@"PresidentListCellIdentifier";
UITableViewCell *cell=[tableViewdequeueReusableCellWithIdentifier:PresidentListCellIdentifier];
if (cell==nil) {
cell=[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:PresidentListCellIdentifier];
}
NSInteger row =[indexPathrow];
BIDPresident *thePres=[self.listobjectAtIndex:row];
cell.textLabel.text=thePres.name;
cell.detailTextLabel.text=[NSStringstringWithFormat:@"%@-%@",thePres.fromYear,thePres.toYear];
return cell;
}
#pragma mark -
#pragma mark Table Delegate Methods
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger row =[indexPathrow];
BIDPresident *prez =[self.listobjectAtIndex:row];
BIDPresidentDetailController *childController =[[BIDPresidentDetailControlleralloc]initWithStyle:UITableViewStyleGrouped];
childController.title=prez.name;
childController.president =prez;//這裏必須時detail表h文件聲明後纔會出現
[self.navigationControllerpushViewController:childControlleranimated:YES];
}
@end
子視圖
#import <UIKit/UIKit.h>
@class BIDPresident;
#define kNumberOfEditableRows 4
#define kNameRowIndex 0
#define kFromYearRowIndex 1
#define kToYearRowIndex 2
#define kPartyIndex 3
#define kLabelTag 4096
@interface BIDPresidentDetailController :UITableViewController
<UITextFieldDelegate>
@property (strong,nonatomic)BIDPresident *president;
@property (strong,nonatomic)NSArray *filedLabels;
@property(strong,nonatomic)NSMutableDictionary *tempValues;
@property (strong,nonatomic)UITextField *currentTextFiled;
-(IBAction)cancel:(id)sender;
-(IBAction)save:(id)sender;
-(IBAction)textFieldDone:(id)sender;
@end
#import "BIDPresidentDetailController.h"
#import "BIDPresident.h"
@implementation BIDPresidentDetailController
@synthesize president;
@synthesize filedLabels;
@synthesize tempValues;
@synthesize currentTextFiled;
-(IBAction)cancel:(id)sender
{
[self.navigationControllerpopViewControllerAnimated:YES];//單擊按鈕Cancel當前視圖出棧,下個視圖升到棧的頂部
}
-(IBAction)save:(id)sender
{
//檢查是否當前有正被編輯的文本字段,有的話將值存放到tempvalues中
if (currentTextFiled !=nil) {
NSNumber* tagAsNum=[NSNumbernumberWithInt:currentTextFiled.tag];
[tempValuessetObject:currentTextFiled.textforKey:tagAsNum];
}
//遍歷字段中的鍵值對,將tempvalues數組的適當值分配給president指定字段
for(NSNumber *keyin [tempValuesallKeys])
{
switch ([keyintValue]) {
casekNameRowIndex:
president.name=[tempValuesobjectForKey:key];
break;
casekFromYearRowIndex:
president.fromYear=[tempValuesobjectForKey:key];
break;
casekToYearRowIndex:
president.toYear=[tempValuesobjectForKey:key];
break;
casekPartyIndex:
president.party=[tempValuesobjectForKey:key];
break;
default:
break;
}
}
//返回列表
[self.navigationControllerpopViewControllerAnimated:YES];
//重新加載數據
NSArray *allController=self.navigationController.viewControllers;
UITableViewController *parent =[allControllerlastObject];
[parent.tableViewreloadData];
}
-(IBAction)textFieldDone:(id)sender
{
//當用戶單擊Done後關閉鍵盤
[sender resignFirstResponder];
}
#pragma mark -
-(void) viewDidLoad
{
[superviewDidLoad];
NSArray *array=[[NSArrayalloc]initWithObjects:@"Name",@"From",@"To",@"Party",nil];
self.filedLabels=array;
UIBarButtonItem *cancelButton=[[UIBarButtonItemalloc]initWithTitle:@"Cancel"style:UIBarButtonItemStylePlaintarget:selfaction:@selector(cancel:)];
self.navigationItem.leftBarButtonItem =cancelButton;
UIBarButtonItem *saveButton=[[UIBarButtonItemalloc]initWithTitle:@"Save"style:UIBarButtonItemStyleDonetarget:selfaction:@selector(save:)];
self.navigationItem.rightBarButtonItem=saveButton;
NSMutableDictionary *dict =[[NSMutableDictionaryalloc]init];
self.tempValues=dict;
}
#pragma mark -
#pragma mark Table Data Source Methods
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
returnkNumberOfEditableRows;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
staticNSString *PresidentCellIdentifier=@"PresidentCellIdentifier";
UITableViewCell *cell= [tableViewdequeueReusableCellWithIdentifier:PresidentCellIdentifier];
if (cell ==nil) {
cell=[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:PresidentCellIdentifier];
//創建一個單元的時候會創建一個標籤,然後創建一個文本字段
UILabel *label= [[UILabelalloc]initWithFrame:CGRectMake(10,10,75, 25)];
label.textAlignment=UITextAlignmentRight;
label.tag=kLabelTag;
label.font=[UIFontboldSystemFontOfSize:14];
[cell.contentViewaddSubview:label];
UITextField *textField=[[UITextFieldalloc]initWithFrame:CGRectMake(90,12,200, 25)];
textField.clearsOnBeginEditing=NO;
[textFieldsetDelegate:self];
textField.returnKeyType =UIReturnKeyDone;//鍵盤的返回鍵類型
[textField addTarget:selfaction:@selector(textFieldDone:)forControlEvents:UIControlEventEditingDidEndOnExit];//調用Did End on Exit事件
[cell.contentViewaddSubview:textField];
}
NSUInteger row =[indexPathrow];
UILabel *label =(UILabel *) [cellviewWithTag:kLabelTag];
UITextField *textField =nil;
for(UIView *oneViewin cell.contentView.subviews)
{
if ([oneViewisMemberOfClass:[UITextFieldclass]]) {
textField=(UITextField *)oneView;
}
}
label.text=[filedLabelsobjectAtIndex:row];
NSNumber *rowAsNum=[NSNumbernumberWithInt:row];
switch (row) {
casekNameRowIndex:
if ([[tempValuesallKeys]containsObject:rowAsNum]) {
textField.text=[tempValuesobjectForKey:rowAsNum];
}
else
textField.text=president.name;
break;
casekFromYearRowIndex:
if ([[tempValuesallKeys]containsObject:rowAsNum]) {
textField.text=[tempValuesobjectForKey:rowAsNum];
}
else
textField.text=president.fromYear;
break;
casekToYearRowIndex:
if ([[tempValuesallKeys]containsObject:rowAsNum]) {
textField.text=[tempValuesobjectForKey:rowAsNum];
}
else
textField.text=president.toYear;
break;
casekPartyIndex:
if ([[tempValuesallKeys]containsObject:rowAsNum]) {
textField.text=[tempValuesobjectForKey:rowAsNum];
}
else
textField.text=president.party;
break;
default:
break;
}
if (currentTextFiled==textField) {
currentTextFiled=nil;
}
textField.tag=row;
return cell;
}
#pragma mark -
#pragma mark Table Delegate Methods
-(NSIndexPath *) tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
returnnil;//該方法將在行被選中時調用,並且允許禁止選中行。作用僅僅是不讓行在選中之後呈突出顯示
}
#pragma mark Text Filed Delegate Methods
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
self.currentTextFiled=textField;//當文本字段稱爲第一響應者時調用此方法。
}
-(void)textFieldDidEndEditing:(UITextField *)textField
{
//當用戶通過單擊不同文本字段或者按下Done按鈕來停止編輯當前文本字段時,調用該方法。將該字段的值保存在tempValues字段中。
NSNumber *tagAsNum=[NSNumbernumberWithInt:textField.tag];
[tempValuessetObject:textField.textforKey:tagAsNum];
}
@end
在FirstLevelController.m中條件
//BIDPresident View/Edit
BIDPresidentsViewController *presidentsViewController=[[BIDPresidentsViewControlleralloc]initWithStyle:UITableViewStylePlain];
presidentsViewController.title=@"Detail Edit";
presidentsViewController.rowImage=[UIImageimageNamed:@"detailEditIcon.png"];
[arrayaddObject:presidentsViewController];