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:)]; 對數據排序。
編輯屬性列表文件
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。
注:
1 本教程是基於關東升老師的教程
2 基於黑蘋果10.6.8和xcode4.2
3 本人初學,有什么不對的望指教
4 教程會隨着本人學習,持續更新
5 教程是本人從word筆記中拷貝出來了,所以格式請見諒