5.1 拾取器
5.2 第一視圖控制器
5.3 第二視圖控制器
5.4 第三視圖控制器
5.5 第四視圖控制器
5.1 拾取器
1 建立一個Tab Bar Application
初始化工程
由于我們要自己建立視圖控制器,包括第一個試圖控制器,是以我們删除:
FirstViewController.h FirstViewController.m SecondView.xib
修改MainWindow.xib檔案
删除MainWindow.xib檔案中自帶的View
指定nib檔案和視圖控制器
指定Tab欄按鈕圖示和title
5.2 第一視圖控制器
DatePickerViewController.h
@interface DatePickerViewController : UIViewController {
IBOutlet UIDatePicker *datePicker;
}
@property (nonatomic, retain) IBOutlet UIDatePicker *datePicker;
-(IBAction)onClickButton:(id)sender;
@end
日期拾取器,要想顯示日期必須定義一個輸出口:
@property (nonatomic, retain) UIDatePicker *datePicker;
定義點選選擇按鈕的動作事件: -(IBAction)onClickButton:(id)sender;
DatePickerViewController.m
@synthesize datePicker;
-(IBAction)onClickButton:(id)sender {
NSDate *selected = [datePicker date];
NSString *message = [[NSString alloc] initWithFormat:@"你選擇的日期: %@", selected];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"選擇日期"
message:message delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[message release];
[alertView show];
[alertView release];
}
onClickButton:是按鈕事件。
SDate *selected = [datePicker date];可以擷取日期拾取器時間。
NSString *message = [[NSString alloc] initWithFormat:@"你選擇的日期: %@", selected];
可以把日期格式化輸出。
初始化和釋放資源
- (void)viewDidLoad {
[super viewDidLoad];
NSDate *now = [NSDate date];
[datePicker setDate:now animated:YES];
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc. that aren't in use.
}
- (void)viewDidUnload {
[super viewDidUnload];
self.datePicker = nil;
}
- (void)dealloc {
[datePicker release];
[super dealloc];
}
在事件viewDidLoad:初始化日期拾取器。
NSDate *now = [NSDate date]; 獲得目前的系統時間。
[datePicker setDate:now animated:YES];
設定日期拾取器的時間,animated:YES是實作動畫效果,在初始化時候滾輪滾動到目前日期。
IB中連結輸出口和動作
日期拾取器作為輸出口,需要通過File's Owner連結到日期拾取器。
還要連結按鈕點選時間,從按鈕連結到File's Owner。
5.3 第二視圖控制器
SinglePickerViewController.h
@interface SinglePickerViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {
UIPickerView *pickerView;
NSArray *pickerData;
}
@property (nonatomic, retain) IBOutlet UIPickerView *pickerView;
@property (nonatomic, retain) NSArray *pickerData;
-(IBAction)onClickButton:(id)sender;
@end
拾取器,要想顯示必須定義一個輸出口: @property (nonatomic, retain) UIPickerView *picker;
定義點選選擇按鈕的動作事件: (IBAction)onClickButton:(id)sender;
pickerData保持拾取器的資料。
拾取器的委托
委托是中的方法是事件觸發時候回調的方法。
拾取器的委托是實作協定UIPickerViewDelegate。
UIPickerViewDelegate回調方法:
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
是當選擇了拾取器時候,根據選擇的行傳回拾取器的title。
拾取器的資料源
通過UIPickerViewDataSource協定為拾取器提供資料源,其中包括拾取器的行和列的資料,下面的是資料源要求的方法:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
該方法提供拾取器列的個數,本例子中是1個。
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
該方法提供了拾取器中行數,這裡的數組pickerData的長度。
m檔案中實作協定
#pragma mark--委托協定方法
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [pickerData objectAtIndex:row];
}
#pragma mark--資料源協定方法
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component {
return [pickerData count];
}
初始化和按鈕事件處理
@synthesize pickerView;
@synthesize pickerData;
- (void)viewDidLoad {
NSArray *array = [[NSArray alloc] initWithObjects:@"歐洲",
@"南美", @"非洲", @"北美",
@"亞洲", @"大洋洲", nil];
self.pickerData = array;
[array release];
}
-(IBAction)onClickButton:(id)sender {
NSInteger row = [pickerView selectedRowInComponent:0];
NSString *selected = [pickerData objectAtIndex:row];
NSString *title = [[NSString alloc] initWithFormat:@"你選擇了 %@!", selected];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title
message:@"謝謝你的選擇."
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[title release];
[alert show];
[alert release];
}
NSInteger row = [picker selectedRowInComponent:0]; 獲得第一列的選擇中的行号。
NSString *selected = [pickerData objectAtIndex:row]; 通過行号獲得選中的資料。
釋放資源
- (void)viewDidUnload {
[super viewDidUnload];
self.pickerView = nil;
self.pickerData = nil;
}
- (void)dealloc {
[pickerView release];
[pickerData release];
[super dealloc];
}
IB中連結輸出口和動作
拾取器的輸出口,需要File‘s Owner與委托和資料源連結。
拾取器的委托和資料源輸出口,需要File‘s Owner與委托和資料源連結。
按鈕動作onClickButton需要連結到File‘s Owner。
5.4 第三視圖控制器
DoublePickerViewController.h
@interface DoublePickerViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {
UIPickerView *pickerView;
NSArray *pickerData1;
NSArray *pickerData2;
}
@property (nonatomic,retain) IBOutlet UIPickerView *pickerView;
@property (nonatomic,retain) NSArray *pickerData1;
@property (nonatomic,retain) NSArray *pickerData2;
-(IBAction)onClick:(id)sender;
@end
拾取器,要想顯示必須定義一個輸出口:
@property (nonatomic, retain) UIPickerView *picker;
定義點選選擇按鈕的動作事件:
-(IBAction)onClick:(id)sender;
@property (nonatomic, retain) NSArray *pickerData1;
@property (nonatomic, retain) NSArray *pickerData2;
保持拾取器兩個列中的資料。
拾取器的委托
委托是中的方法是事件觸發時候回調的方法。
拾取器的委托是實作協定UIPickerViewDelegate。
UIPickerViewDelegate回調方法:
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
是當選擇了拾取器時候,根據選擇的行傳回拾取器的title。
拾取器的資料源
通過UIPickerViewDataSource協定為拾取器提供資料源,其中包括拾取器的行和列的資料,下面的是資料源要求的方法:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
該方法提供拾取器列的個數,本例子中是2個。
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
該方法提供了拾取器中行數,這裡的數組pickerData的長度。
m檔案中實作協定
#pragma mark--委托協定方法
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component {
if (component == 0) { //選擇了第一列
return [pickerData1 objectAtIndex:row];
} else {//選擇了第二列
return [pickerData2 objectAtIndex:row];
}
}
#pragma mark--資料源協定方法
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 2;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component {
if (component == 0) { //選擇了第一列
return [pickerData1 count];
} else {//選擇了第二列
return [pickerData2 count];
}
}
component == 0代表選擇的第一列即“洲”。如果component == 1代表選擇的是第二列即“體育項目”。
這兩個列直接沒有關聯關系,即你選擇了前面和選擇了後面沒有關系,不會關聯。
初始化處理
- (void)viewDidLoad {
NSArray *array1 = [[NSArray alloc] initWithObjects:@"歐洲",
@"南美", @"非洲", @"北美",
@"亞洲", @"大洋洲", nil];
self.pickerData1 = array1;
NSArray *array2 = [[NSArray alloc] initWithObjects:@"足球",
@"籃球", @"羽毛球", @"乒乓球", nil];
self.pickerData2 = array2;
[array1 release];
[array2 release];
}
按鈕事件處理
-(IBAction)onClick:(id)sender {
NSInteger row1 = [pickerView selectedRowInComponent:0];
NSInteger row2 = [pickerView selectedRowInComponent:1];
NSString *selected1 = [pickerData1 objectAtIndex:row1];
NSString *selected2 = [pickerData2 objectAtIndex:row2];
NSString *title = [[NSString alloc] initWithFormat:@"你選擇了 %@的%@項目!",
selected1,selected2];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title
message:@"謝謝你的選擇."
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[selected1 release];
[selected2 release];
[title release];
[alert show];
[alert release];
}
釋放資源
- (void)viewDidUnload {
[super viewDidUnload];
self.pickerData1 = nil;
self.pickerData2 = nil;
self.pickerView = nil;
}
- (void)dealloc {
[pickerData1 release];
[pickerData2 release];
[pickerView release];
[super dealloc];
}
IB中連結輸出口和動作
拾取器的輸出口,需要File‘s Owner與委托和資料源連結。
拾取器的委托和資料源輸出口,需要File‘s Owner與委托和資料源連結。
按鈕動作onClickButton需要連結到File‘s Owner。
5.5 第四視圖控制器
DependentViewController.h
@interface DependentPickerViewController : UIViewController <UIPickerViewDelegate,UIPickerViewDataSource>{
NSDictionary *data;
NSArray *pickerData1;
NSArray *pickerData2;
UIPickerView *pickerView;
}
@property (nonatomic, retain) NSDictionary *data;
@property (nonatomic, retain) NSArray *pickerData1;
@property (nonatomic, retain) NSArray *pickerData2;
@property (nonatomic, retain) IBOutlet UIPickerView *pickerView;
-(IBAction)onClick:(id)sender;
@end
拾取器,要想顯示必須定義一個輸出口: @property (nonatomic, retain) UIPickerView *pickerView;
定義點選選擇按鈕的動作事件: -(IBAction)onClickButton:(id)sender;
@property (nonatomic, retain) NSDictionary *data; 儲存所有資料
@property (nonatomic, retain) NSArray *pickerData1; 儲存第一列的資料
@property (nonatomic, retain) NSArray *pickerData2; 保持第二列的資料
m檔案中的初始化方法
@synthesize data;
@synthesize pickerData1;
@synthesize pickerData2;
@synthesize pickerView;
- (void)viewDidLoad {
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"足球隊dictionary"
ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.data = dict;
[dict release];
NSArray *col1 = [self.data allKeys];
NSArray *sorted = [col1 sortedArrayUsingSelector:@selector(compare:)];
self.pickerData1 = sorted;
NSString *selectCol1 = [self.pickerData1 objectAtIndex:0];
NSArray *col2 = [self.data objectForKey:selectCol1];
self.pickerData2 = col2;
}
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"足球隊dictionary" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] nitWithContentsOfFile:plistPath];
這幾行代碼是從statedictionary.plist屬性清單檔案中讀取到NSDictionary對象中。
NSArray *sorted = [col1 sortedArrayUsingSelector:@selector(compare:)]; 對資料排序。
在Xcode中建立屬性清單檔案
編輯屬性清單檔案
m中的按鈕點選事件
-(IBAction)onClick:(id)sender {
NSInteger row1 = [pickerView selectedRowInComponent:0];
NSInteger row2 = [pickerView selectedRowInComponent:1];
NSString *selected1 = [pickerData1 objectAtIndex:row1];
NSString *selected2 = [pickerData2 objectAtIndex:row2];
NSString *title = [[NSString alloc] initWithFormat:@"你選擇了 %@的%@項目!",
selected1,selected2];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title
message:@"謝謝你的選擇."
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[selected1 release];
[selected2 release];
[title release];
[alert show];
[alert release];
}
實作委托方法
#pragma mark--委托協定方法
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component {
if (component == 0) { //選擇了第一列
return [pickerData1 objectAtIndex:row];
} else {//選擇了第二列
return [pickerData2 objectAtIndex:row];
}
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row
inComponent:(NSInteger)component {
if (component == 0) {
NSString *selectCol1 = [pickerData1 objectAtIndex:row];
NSArray *col2 = [self.data objectForKey:selectCol1];
pickerData2 = col2;
//[self.pickerView selectRow:0 inComponent:1 animated:YES];
[self.pickerView reloadComponent:1];
}
}
委托方法是實作拾取器控件兩個輪互動關鍵:
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
在該方法中通過下面語句重新加載拾取器: [self.pickerView reloadComponent:1];
實作資料源方法
#pragma mark--資料源協定方法
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 2;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component {
if (component == 0) { //選擇了第一列
return [pickerData1 count];
} else {//選擇了第二列
return [pickerData2 count];
}
}
釋放資源
- (void)viewDidUnload {
[super viewDidUnload];
self.data = nil;
self.pickerData1 = nil;
self.pickerData2 = nil;
self.pickerView = nil;
}
- (void)dealloc {
[pickerData1 release];
[pickerData2 release];
[data release];
[pickerView release];
[super dealloc];
}
IB中連結輸出口和動作
拾取器的輸出口,需要File‘s Owner與委托和資料源連結。
拾取器的委托和資料源輸出口,需要File‘s Owner與委托和資料源連結。
按鈕動作onClickButton需要連結到File‘s Owner。