iOS 5 Storyboard 學習之 Tabbar Controller,Navigation Controller (3) 深入Segue,Class,Protocol,Delegate的基本使用


繼續《iOS 5 Storyboard 學習之 Tabbar Controller,Navigation Controller (2)》的內容,如果想從頭學習Storyboard,請參考iOS 5 Storyboard 學習之 UITableViews

1 首先我們添加一個“添加按鈕”

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


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

2 隨后托一個“Table View Controller”,然后配置它

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

然后embed in Navigation Controller
屏幕快照 2012-03-07 下午8.34.19.png

從左上角的加號按鈕 Control+Drog 到新的“Navigation Controller”上然后選擇Modal


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

把這個Segue的Identifier設置成“AddPlayer”

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

之后的樣子是這樣的
屏幕快照 2012-03-07 下午8.35.30.png

3 建立新的“PlayerDetailsViewController”subclass是”UITableViewController“

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

然后綁定到”Table View Controller“上去


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

增加兩個”Bar Button Items“

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

然后鏈接Done 和 Cancel 的 outlet


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

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”頁

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


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

向cell里邊拖一個“Text Field”然后去掉邊框,把“Text Field”拖到cell一樣大小,下面的“類別”做一樣的動作。
屏幕快照 2012-03-12 下午2.17.39.jpg

拖動用戶名的“Text Field”到“PlayerDetailViewController.h”,然后在name欄內填寫“nameTextField”,選擇Connect,之后xcode會建立一條語句,也同時會在“PlayerDetailViewController.m”中建立synthesized和viewDidUnload,非常方便。

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


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


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

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

}

目前我們完成了,最后我們加入類型的選擇就基本上完成了


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

--EOF--


免責聲明!

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



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