IOS5基礎十七------可編輯的詳細單元格

詳細的單元格包含很多控件,並且數據更加複雜,需要一個自定義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;//這裏必須時detailh文件聲明後纔會出現

    [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];



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章