繼續《iOS 5 Storyboard 學習之 Tabbar Controller,Navigation Controller (2)》的內容,如果想從頭學習Storyboard,請參考《iOS 5 Storyboard 學習之 UITableViews》
1 首先我們添加一個“添加按鈕”
2 隨后托一個“Table View Controller”,然后配置它
然后embed in Navigation Controller
從左上角的加號按鈕 Control+Drog 到新的“Navigation Controller”上然后選擇Modal
把這個Segue的Identifier設置成“AddPlayer”
之后的樣子是這樣的
3 建立新的“PlayerDetailsViewController”subclass是”UITableViewController“
然后綁定到”Table View Controller“上去
增加兩個”Bar Button Items“
然后鏈接Done 和 Cancel 的 outlet
4 現在用Delegate寫按鈕
修改“PlayerDetailsViewController.h”
#import <UIKit/UIKit.h>
@class PlayerDetailsViewController;
@protocol PlayerDetailsViewControllerDelegate <NSObject>
- (void)playerDetailsViewControllerDidCancel:(PlayerDetailsViewController *)controller;
- (void)playerDetailsViewControllerDidDone:(PlayerDetailsViewController *)controller;
@end
@interface PlayerDetailsViewController : UITableViewController
@property (nonatomic,weak) id <PlayerDetailsViewControllerDelegate> delegate;
- (IBAction)cancel:(id)sender;
- (IBAction)done:(id)sender;
@end
看看上邊都干了些什么
1 Class
2 建立Procotol PlayerDetailsViewControllerDelegate
3 創建delegate
在“PlayerDetailsViewController.m”中寫按鈕事件
@synthesize delegate;
-(IBAction)cancel:(id)sender
{
[self.delegate playerDetailsViewControllerDidCancel:self];
}
-(IBAction)done:(id)sender
{
[self.delegate playerDetailsViewControllerDidDone:self];
}
然后在“PlayerViewController.h”添加
#import "PlayerDetailsViewController.h"
@interface PlayersViewController : UITableViewController<PlayerDetailsViewControllerDelegate>
在“PlayerViewController.m”添加
#pragma mark - PlayerDetailsViewControllerDelegate
- (void)playerDetailsViewControllerDidCancel:(PlayerDetailsViewController *)controller
{
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)playerDetailsViewControllerDidDone:(PlayerDetailsViewController *)controller
{
[self dismissViewControllerAnimated:YES completion:nil];
}
注意這里的“ [self dismissViewControllerAnimated:YES completion:nil];”是iOS 5里用來代替“ dismissModalViewControllerAnimated”的。
在“PlayerViewController.m”寫AddPlayer Segue
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([segue.identifier isEqualToString:@"AddPlayer"])
{
UINavigationController *navigationController = segue.destinationViewController;
PlayerDetailsViewController *playerDetailsViewController =
[[navigationController viewControllers] objectAtIndex:0];
playerDetailsViewController.delegate = self;
}
}
如果不加入上邊這段Segue代碼,那么AddPlayer頁是可以打開的,但是無法通過點擊按鈕關閉的。
5 點擊“MainStoryboard.storyboard”編輯“Add Player”頁
向cell里邊拖一個“Text Field”然后去掉邊框,把“Text Field”拖到cell一樣大小,下面的“類別”做一樣的動作。
拖動用戶名的“Text Field”到“PlayerDetailViewController.h”,然后在name欄內填寫“nameTextField”,選擇Connect,之后xcode會建立一條語句,也同時會在“PlayerDetailViewController.m”中建立synthesized和viewDidUnload,非常方便。
@property (strong, nonatomic) IBOutlet UITextField *nameTextField;
@property (strong, nonatomic) IBOutlet UILabel *detailLabel;
由於table view controller 使用了static cells所以就不需要數據源(data source) ,那么我們可以把“PlayerDetailViewController.h”內從“#pragma mark - Table view data source”到 “#pragma mark - Table view delegate”的代碼都刪除掉。
6 然后在“PlayerDetailViewController.h”加入
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
if(indexPath.section ==0)
[self.nameTextField becomeFirstResponder];
}
以上代碼很簡單就是當我們進入”添加用戶“頁面,點擊第一個文字輸入框啟動” nameTextField“然后彈出鍵盤。
7 現在我們要修改這個”Done“按鈕的功能,剛才我們把它定義為和cacel,現在我們真正的賦予它功能,以下一共三步:
首先在PlayerDetailViewController.h”中修改
@class PlayerDetailsViewController;
@class Player;
@protocol PlayerDetailsViewControllerDelegate <NSObject>
- (void)playerDetailsViewControllerDidCancel:(PlayerDetailsViewController *)controller;
- (void)playerDetailsViewController:(PlayerDetailsViewController *)controller didAddPlayer:(Player *)player;
@end
然后在PlayerDetailViewController.m”中修改按鈕事件
#import "Player.h"
-(IBAction)done:(id)sender
{
Player *player =[[Player alloc] init];
player.name = self.nameTextField.text;
player.game =@"Chess";
player.rating =1;
[self.delegate playerDetailsViewController:self didAddPlayer:player];
}
最后我們在“ PlayerViewController.m”中把Done按鈕部分替換掉
#pragma mark - PlayerDetailsViewControllerDelegate
- (void)playerDetailsViewControllerDidCancel:(PlayerDetailsViewController *)controller
{
[self dismissViewControllerAnimated:YES completion:nil];
}
-(void)playerDetailsViewController:(PlayerDetailsViewController *)controller
didAddPlayer:(Player *)player
{
[self.players addObject:player];
NSIndexPath*indexPath =[NSIndexPath indexPathForRow:[self.players count]-1 inSection:0];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
[self dismissViewControllerAnimated:YES completion:nil];
}
目前我們完成了,最后我們加入類型的選擇就基本上完成了
--EOF--