zoukankan      html  css  js  c++  java
  • IOS之高级控件拾取器

    5.1 拾取器

    5.2 第一视图控制器

    5.3 第二视图控制器

    5.4 第三视图控制器

    5.5 第四视图控制器

    5.1 拾取器

    wps_clip_image-20916

    wps_clip_image-24785

    1 创建一个Tab Bar Application

    初始化工程

    由于我们要自己创建视图控制器,包括第一个试图控制器,所以我们删除:

    FirstViewController.h  FirstViewController.m  SecondView.xib

    修改MainWindow.xib文件

    删除MainWindow.xib文件中自带的View

    指定nib文件和视图控制器

    wps_clip_image-26911

    指定Tab栏按钮图标和title

    wps_clip_image-8240

    5.2 第一视图控制器

    wps_clip_image-30786

    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 第二视图控制器

    wps_clip_image-14442

    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 第三视图控制器

    wps_clip_image-26761

    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 第四视图控制器

    wps_clip_image-25148

    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中创建属性列表文件
    wps_clip_image-14632

    编辑属性列表文件

    wps_clip_image-15888

    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笔记中拷贝出来了,所以格式请见谅

  • 相关阅读:
    A. Dawid and Bags of Candies ( Codeforces Round #588 (Div. 2) )
    B. Ania and Minimizing (Codeforces Round #588 (Div. 2) )
    残缺的棋盘 (BFS)
    Max Sum (动态规划)
    高桥和低桥 (离散化 )
    White Sheet (矩形面积模板) (Codeforces Round #587 (Div. 3) )
    Catch That Cow (BFS luo搜 + 剪枝)
    Python笔记-字符串
    关于拖延症
    一些告诫
  • 原文地址:https://www.cnblogs.com/syxchina/p/2676998.html
Copyright © 2011-2022 走看看