繼續《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”
設置“Table View Controller”的cell 的 Style為Basic
2 建立“ GamePickerViewController”,Class 是 Table View Controller
然后編輯 “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”
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並且把值傳回去
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];
}
看下最后的結果
完整的代碼在這里獲取 https://github.com/xxd/Storyboard-Multi-Nav
--EOF--