iOS 5 Storyboard 學習之 Tabbar Controller,Navigation Controller (4) 完成


繼續《iOS 5 Storyboard 學習之 Tabbar Controller,Navigation Controller (3) 深入Segue,Class,Protocol,Delegate的基本使用》的內容,如果想從頭學習Storyboard,請參考iOS 5 Storyboard 學習之 UITableViews

1 我們來建立最后一個TableViewController,用來控制類別的選擇。托一個“Table View Controller”,從類別 Control+Drog 到新的“Navigation Controller”上然后選擇“Push”,Segue的identifier為“PickGame”


屏幕快照 2012-03-12 下午4.12.47.png

設置“Table View Controller”的cell 的 Style為Basic

屏幕快照 2012-03-12 下午3.30.36.png

2 建立“ GamePickerViewController”,Class 是 Table View Controller

屏幕快照 2012-03-07 下午10.43.37.png

然后編輯 “GamePickerViewController.h”

#import <UIKit/UIKit.h>

 

@interface GamePickerViewController : UITableViewController {

NSArray *games;

}

 

@end

“GamePickerViewController.m”

-(void)viewDidLoad

{

[super viewDidLoad];

games =[NSArray arrayWithObjects:@"游泳",@"籃球",@"足球",@"象棋",@"國際象棋",@"Dota",nil];

}

- (void)viewDidUnload

{

[super viewDidUnload];

games =nil;

}

 

 

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{

return 1;

}

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

{

return[games count];

}

 

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

{

UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:@"GameCell"];

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

return cell;

}

這里別忘了給Cell設置Identifier為“GameCell”


屏幕快照 2012-03-12 下午3.38.01.png

3 一切配置都完成了,我們開始寫Delegate類似我們在Player View那里做的一樣。

3.1 首先在“ GamePickerViewController.m”中修改為:

@class GamePickerViewController;

 

@protocol GamePickerViewControllerDelegate <NSObject>

-(void)gamePickerViewController:(GamePickerViewController *)controller didSelectGame:(NSString *)game;

@end

 

@interface GamePickerViewController : UITableViewController

@property (nonatomic,weak) id <GamePickerViewControllerDelegate> delegate;

@property (nonatomic,strong) NSString *game;

 

@end

3.2 然后在“ GamePickerViewController.m”中添加和修改

@implementation GamePickerViewController

{

NSArray*games;

NSUInteger selectedIndex;

}

@synthesize delegate,game;

 

 

-(void)viewDidLoad

{

[super viewDidLoad];

games =[NSArray arrayWithObjects:@"游泳",@"籃球",@"足球",@"象棋",@"國際象棋",@"Dota",nil];

selectedIndex =[games indexOfObject:self.game];

}

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

{

UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:@"GameCell"];

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

if(indexPath.row == selectedIndex)

cell.accessoryType = UITableViewCellAccessoryCheckmark;

else

cell.accessoryType = UITableViewCellAccessoryNone;

return cell;

}

 

 

 

#pragma mark - Table view delegate

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath

{

  [tableView deselectRowAtIndexPath:indexPath animated:YES];

  if(selectedIndex != NSNotFound){

  UITableViewCell *cell =[tableView cellForRowAtIndexPath:

  [NSIndexPath indexPathForRow:selectedIndex inSection:0]];

  cell.accessoryType = UITableViewCellAccessoryNone;

  }

  selectedIndex = indexPath.row;

  UITableViewCell *cell =[tableView cellForRowAtIndexPath:indexPath];

  cell.accessoryType = UITableViewCellAccessoryCheckmark;

  NSString *theGame =[games objectAtIndex:indexPath.row];

  [self.delegate gamePickerViewController:self didSelectGame:theGame];

}

3.3 回顧一下

3.3.1 可以看出Delegate中唯一的一個方法就是傳遞選擇的類型

3.3.2 選擇的類型,會在self.game中,那么它會在ViewDidLoad的時候加載

3.3.3 我們利用“ selectedIndex”會知道我們選擇的類型是在self.game中的哪一個

3.3.4 在“cell.textLabel.text =[games objectAtIndex:indexPath.row];”這里我們給Text賦值

3.3.5 然后我們到了最后一步,當我們選擇一個cell之后我們回退到上一個view並且把值傳回去


屏幕快照 2012-03-12 下午4.13.49.png

4但是目前它是上邊這樣的,不能回退,所以最后一步我們就讓它把值傳回去

4.1 回到“PlayerDetailsViewController.h”改為

#import "GamePickerViewController.h"

 

@interface PlayerDetailsViewController : UITableViewController <GamePickerViewControllerDelegate>

4.2 在 PlayerDetailsViewController.h”中加入Segue部分內容,它是負責把值傳遞回去的

@implementation PlayerDetailsViewController

{

NSString*game;

}

4.3 在 PlayerDetailsViewController.h”中修改

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

{

if([segue.identifier isEqualToString:@"PickGame"])

{

GamePickerViewController *gamePickerViewController =

segue.destinationViewController;

gamePickerViewController.delegate = self;

gamePickerViewController.game = game;

}

}

 

 

-(id)initWithCoder:(NSCoder*)aDecoder

{

if((self =[super initWithCoder:aDecoder]))

{

NSLog(@"init PlayerDetailsViewController");

game =@"國際象棋";

}

return self;

}

 

 

- (void)viewDidLoad

{

[super viewDidLoad];

self.detailLabel.text = game;

}

#pragma mark - GamePickerViewControllerDelegate

 

- (void)gamePickerViewController:(GamePickerViewController *)controller didSelectGame:(NSString *)theGame

{

game = theGame;

self.detailLabel.text = game;

 

[self.navigationController popViewControllerAnimated:YES];

}

 

 

-(IBAction)done:(id)sender

{

Player *player =[[Player alloc] init];

player.name = self.nameTextField.text;

player.game = game;

player.rating =1;

[self.delegate playerDetailsViewController:self didAddPlayer:player];

}

看下最后的結果


屏幕快照 2012-03-12 下午4.52.42.png屏幕快照 2012-03-12 下午4.52.47.png

完整的代碼在這里獲取 https://github.com/xxd/Storyboard-Multi-Nav

--EOF--


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM