天天看點

5 進階控件-拾取器

5.1 拾取器

5.2 第一視圖控制器

5.3 第二視圖控制器

5.4 第三視圖控制器

5.5 第四視圖控制器

5.1 拾取器

5 進階控件-拾取器
5 進階控件-拾取器

1 建立一個Tab Bar Application

初始化工程

由于我們要自己建立視圖控制器,包括第一個試圖控制器,是以我們删除:

FirstViewController.h  FirstViewController.m  SecondView.xib

修改MainWindow.xib檔案

删除MainWindow.xib檔案中自帶的View

指定nib檔案和視圖控制器

5 進階控件-拾取器

指定Tab欄按鈕圖示和title

5 進階控件-拾取器

5.2 第一視圖控制器

5 進階控件-拾取器

DatePickerViewController.h

5 進階控件-拾取器
@interface DatePickerViewController : UIViewController {
    IBOutlet UIDatePicker *datePicker;
}
@property (nonatomic, retain) IBOutlet UIDatePicker *datePicker;
-(IBAction)onClickButton:(id)sender;

@end      
5 進階控件-拾取器

日期拾取器,要想顯示日期必須定義一個輸出口:

@property (nonatomic, retain)  UIDatePicker *datePicker;

定義點選選擇按鈕的動作事件: -(IBAction)onClickButton:(id)sender;

DatePickerViewController.m

5 進階控件-拾取器
@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];
    
    
}      
5 進階控件-拾取器

onClickButton:是按鈕事件。

SDate *selected = [datePicker date];可以擷取日期拾取器時間。

NSString *message = [[NSString alloc] initWithFormat:@"你選擇的日期: %@", selected];

可以把日期格式化輸出。

初始化和釋放資源

5 進階控件-拾取器
- (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];
}      
5 進階控件-拾取器

在事件viewDidLoad:初始化日期拾取器。

NSDate *now = [NSDate date]; 獲得目前的系統時間。

[datePicker setDate:now animated:YES];

設定日期拾取器的時間,animated:YES是實作動畫效果,在初始化時候滾輪滾動到目前日期。

IB中連結輸出口和動作

日期拾取器作為輸出口,需要通過File's Owner連結到日期拾取器。

還要連結按鈕點選時間,從按鈕連結到File's Owner。

5.3 第二視圖控制器

5 進階控件-拾取器

SinglePickerViewController.h

5 進階控件-拾取器
@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      
5 進階控件-拾取器

拾取器,要想顯示必須定義一個輸出口: @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檔案中實作協定

5 進階控件-拾取器
#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];
}      
5 進階控件-拾取器

初始化和按鈕事件處理

5 進階控件-拾取器
@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];    
    
}      
5 進階控件-拾取器

NSInteger row = [picker selectedRowInComponent:0]; 獲得第一列的選擇中的行号。

NSString *selected = [pickerData objectAtIndex:row]; 通過行号獲得選中的資料。

釋放資源 

5 進階控件-拾取器
- (void)viewDidUnload {
    [super viewDidUnload];
    self.pickerView = nil;
    self.pickerData = nil;
}


- (void)dealloc {
    [pickerView release];
    [pickerData release];
    [super dealloc];
}      
5 進階控件-拾取器

IB中連結輸出口和動作

拾取器的輸出口,需要File‘s Owner與委托和資料源連結。

拾取器的委托和資料源輸出口,需要File‘s Owner與委托和資料源連結。

按鈕動作onClickButton需要連結到File‘s Owner。

5.4 第三視圖控制器

5 進階控件-拾取器

DoublePickerViewController.h

5 進階控件-拾取器
@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      
5 進階控件-拾取器

拾取器,要想顯示必須定義一個輸出口:

@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檔案中實作協定

5 進階控件-拾取器
#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];
    }
}      
5 進階控件-拾取器

component == 0代表選擇的第一列即“洲”。如果component == 1代表選擇的是第二列即“體育項目”。

這兩個列直接沒有關聯關系,即你選擇了前面和選擇了後面沒有關系,不會關聯。

初始化處理

5 進階控件-拾取器
- (void)viewDidLoad {
    NSArray *array1 = [[NSArray alloc] initWithObjects:@"歐洲", 
                       @"南美", @"非洲", @"北美",
                       @"亞洲", @"大洋洲", nil];
    self.pickerData1 = array1;
    NSArray *array2 = [[NSArray alloc] initWithObjects:@"足球", 
                       @"籃球", @"羽毛球", @"乒乓球", nil];
    self.pickerData2 = array2;
    
    [array1 release];
    [array2 release];
}      
5 進階控件-拾取器

按鈕事件處理

5 進階控件-拾取器
-(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];
}      
5 進階控件-拾取器

釋放資源

5 進階控件-拾取器
- (void)viewDidUnload {
    [super viewDidUnload];
    self.pickerData1 = nil;
    self.pickerData2 = nil;
    self.pickerView = nil;
}


- (void)dealloc {
    [pickerData1 release];
    [pickerData2 release];
    [pickerView release];
    [super dealloc];
}      
5 進階控件-拾取器

IB中連結輸出口和動作

拾取器的輸出口,需要File‘s Owner與委托和資料源連結。

拾取器的委托和資料源輸出口,需要File‘s Owner與委托和資料源連結。

按鈕動作onClickButton需要連結到File‘s Owner。

5.5 第四視圖控制器

5 進階控件-拾取器

DependentViewController.h

5 進階控件-拾取器
@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      
5 進階控件-拾取器

拾取器,要想顯示必須定義一個輸出口: @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檔案中的初始化方法

5 進階控件-拾取器
@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;
    
}      
5 進階控件-拾取器

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中建立屬性清單檔案 

5 進階控件-拾取器

編輯屬性清單檔案

5 進階控件-拾取器

m中的按鈕點選事件

5 進階控件-拾取器
-(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];
}      
5 進階控件-拾取器

實作委托方法

5 進階控件-拾取器
#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];
    }
}      
5 進階控件-拾取器

委托方法是實作拾取器控件兩個輪互動關鍵:

- (void)pickerView:(UIPickerView *)pickerView  didSelectRow:(NSInteger)row inComponent:(NSInteger)component

在該方法中通過下面語句重新加載拾取器: [self.pickerView reloadComponent:1];

實作資料源方法

5 進階控件-拾取器
#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];
    }
}      
5 進階控件-拾取器

釋放資源

5 進階控件-拾取器
- (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];
}      
5 進階控件-拾取器

IB中連結輸出口和動作

拾取器的輸出口,需要File‘s Owner與委托和資料源連結。

拾取器的委托和資料源輸出口,需要File‘s Owner與委托和資料源連結。

按鈕動作onClickButton需要連結到File‘s Owner。

繼續閱讀