zoukankan      html  css  js  c++  java
  • Pickers应用程序

    一、效果

    1. 程序启动进入日期选取器界面,点击按钮显示所选的日期

    2. 点击底下工具栏Single,进入单滚轮选取器,点击按钮提示所选信息

    3. 点击底下工具栏Double,进入双滚轮选取器,两滚轮各自独立互不影响。点击按钮,提示所选信息

    4. 点击底下工具栏Dependent,进入双滚轮选取器,其中第个滚轮随第一个滚轮的变化而变化。点击按钮提示所选信息

    5. 点击底下工具栏Custom,进入自定义选取器。点击按钮,随机产生5张图片,只要有相连的3张图片,就胜利

    二、分析

    1. 根控制器是一个UITabBarController,控制5个UIViewController之间的切换

    2. 在各个控制器的View上面拉选取器控件,设定数据源与委托对象

    3. 在各个控制器上实现选取器内容的展现

    三、 实现

    1. Main.storyboard布局

    2. 文件

    3. 属性列表文件

    4. 由于是用storyboard实现的控件布局,所以并不用在主控制器上做什么,其中布局跳转都已经在storyboard里面完成了,现在主要是配置子控制器实现文件

    5. DatePickerViewController.m

     1 //
     2 //  DatePickerViewController.m
     3 //  7.1-创建Pickers应用程序
     4 //
     5 //  Created by LinKun on 16/7/16.
     6 //  Copyright © 2016年 Apress. All rights reserved.
     7 //
     8 
     9 #import "DatePickerViewController.h"
    10 
    11 @interface DatePickerViewController ()
    12 /** 日期选取器 */
    13 @property (weak, nonatomic) IBOutlet UIDatePicker *datePicker;
    14 
    15 @end
    16 
    17 @implementation DatePickerViewController
    18 
    19 - (void)viewDidLoad {
    20     [super viewDidLoad];
    21     // Do any additional setup after loading the view.
    22 }
    23 
    24 #pragma mark - 提示当前日期选取器所选日期
    25 - (IBAction)buttonPressed:(UIButton *)sender {
    26     // 提取选取器日期
    27     NSDate *date = self.datePicker.date;
    28     
    29     // 警告信息
    30     NSString *message = [NSString stringWithFormat:@"The date and time you selected is %@", date];
    31     // 创建警告框
    32     UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Date and Time Selected" message:message preferredStyle:UIAlertControllerStyleAlert];
    33     UIAlertAction *action = [UIAlertAction actionWithTitle:@"That's true" style:UIAlertActionStyleDefault handler:nil];
    34     [alert addAction:action];
    35     [self presentViewController:alert animated:YES completion:nil];
    36 }
    37 
    38 @end

    6. SingleComponentPickerViewController.m

     1 //
     2 //  SingleComponentPickerViewController.m
     3 //  7.1-创建Pickers应用程序
     4 //
     5 //  Created by LinKun on 16/7/16.
     6 //  Copyright © 2016年 Apress. All rights reserved.
     7 //
     8 
     9 #import "SingleComponentPickerViewController.h"
    10 
    11 #pragma mark 遵循选取器的数据源、委托方法
    12 @interface SingleComponentPickerViewController () <UIPickerViewDelegate, UIPickerViewDataSource>
    13 /** 单轮选取器 */
    14 @property (weak, nonatomic) IBOutlet UIPickerView *singlePicker;
    15 /** 人物姓名 */
    16 @property (strong, nonatomic) NSArray *characterNames;
    17 
    18 @end
    19 
    20 @implementation SingleComponentPickerViewController
    21 
    22 - (void)viewDidLoad {
    23     [super viewDidLoad];
    24     // Do any additional setup after loading the view.
    25     // 加载数据
    26     self.characterNames = @[@"Xiaoming", @"Maike", @"Qiongsi", @"Jieke", @"Jane", @"Aha"];
    27     
    28 }
    29 
    30 #pragma mark - 提示当前单轮选取器所选的内容
    31 - (IBAction)SingleButton:(id)sender {
    32     // 所选行索引
    33     NSInteger row = [self.singlePicker selectedRowInComponent:0];
    34     // 根据行索引找到对应行数据
    35     NSString *selected = self.characterNames[row];
    36     // 警告框标题
    37     NSString *title = [NSString stringWithFormat:@"You sellected %@", selected];
    38     
    39     // 创建警告框
    40     UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:@"Thank you for choosing." preferredStyle:UIAlertControllerStyleAlert];
    41     // 警告按钮
    42     UIAlertAction *action = [UIAlertAction actionWithTitle:@"You're welcome" style:UIAlertActionStyleDefault handler:nil];
    43     
    44     [alert addAction:action];
    45     [self presentViewController:alert animated:YES completion:nil];
    46     
    47 }
    48 
    49 #pragma mark - 选取器数据源
    50 #pragma mark 多少个滚轮
    51 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    52     return 1;
    53 }
    54 #pragma mark 各个滚轮有多少行
    55 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    56     return [self.characterNames count];
    57 }
    58 
    59 #pragma mark 选取器委托
    60 #pragma mark 选取器滚轮的行标题
    61 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    62     return self.characterNames[row];
    63 }
    64 
    65 
    66 @end

    7. DoubleComponentPickerViewController.m

     1 //
     2 //  DoubleComponentPickerViewController.m
     3 //  7.1-创建Pickers应用程序
     4 //
     5 //  Created by LinKun on 16/7/16.
     6 //  Copyright © 2016年 Apress. All rights reserved.
     7 //
     8 
     9 #import "DoubleComponentPickerViewController.h"
    10 
    11 #pragma mark 滚轮的索引
    12 #define kCoolDrink 0
    13 #define kSize 1
    14 
    15 @interface DoubleComponentPickerViewController () <UIPickerViewDataSource, UIPickerViewDelegate>
    16 /** 双滚轮选取器 */
    17 @property (weak, nonatomic) IBOutlet UIPickerView *doublePicker;
    18 // 滚轮数据
    19 @property (strong, nonatomic) NSArray *coolDrinkTypes;
    20 @property (strong, nonatomic) NSArray *sizeTypes;
    21 
    22 @end
    23 
    24 @implementation DoubleComponentPickerViewController
    25 
    26 - (void)viewDidLoad {
    27     [super viewDidLoad];
    28     // Do any additional setup after loading the view.
    29     // 加载数据
    30     self.coolDrinkTypes = @[@"百事", @"可乐", @"雪碧", @"牛奶", @"柠檬汁", @"西瓜汁"];
    31     self.sizeTypes = @[@"大杯", @"中杯", @"小杯"];
    32 }
    33 
    34 #pragma mark - 提示所选信息
    35 - (IBAction)DoubleButton:(UIButton *)sender {
    36     // 提取各滚轮所选行索引
    37     NSInteger coolDrinkRow = [self.doublePicker selectedRowInComponent:kCoolDrink];
    38     NSInteger sizeRow = [self.doublePicker selectedRowInComponent:kSize];
    39     // 提取行索引对应行数据
    40     NSString *coolDrink = self.coolDrinkTypes[coolDrinkRow];
    41     NSString *size = self.sizeTypes[sizeRow];
    42     // 警告框提示信息
    43     NSString *message = [NSString stringWithFormat:@"您点的 %@ %@ 马上送到!", coolDrink, size];
    44     
    45     // 创建警告框
    46     UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Thank you for your order" message:message preferredStyle:UIAlertControllerStyleAlert];
    47     UIAlertAction *action = [UIAlertAction actionWithTitle:@"Thank you" style:UIAlertActionStyleDefault handler:nil];
    48     [alert addAction:action];
    49     [self presentViewController:alert animated:YES completion:nil];
    50     
    51     
    52 }
    53 
    54 #pragma mark - 选取器数据源
    55 #pragma mark 滚轮数
    56 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    57     return 2;
    58 }
    59 #pragma mark 行数
    60 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    61     if (component == kCoolDrink) {
    62         return [self.coolDrinkTypes count];
    63     } else {
    64         return [self.sizeTypes count];
    65     }
    66 }
    67 
    68 #pragma mark - 选取器委托
    69 #pragma mark 行标题
    70 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    71     if (component == kCoolDrink) {
    72         return self.coolDrinkTypes[row];
    73     } else {
    74         return self.sizeTypes[row];
    75     }
    76 }
    77 
    78 
    79 
    80 @end

    8. DependentComponentPickerViewController.m

      1 //
      2 //  DependentComponentPickerViewController.m
      3 //  7.1-创建Pickers应用程序
      4 //
      5 //  Created by LinKun on 16/7/16.
      6 //  Copyright © 2016年 Apress. All rights reserved.
      7 //
      8 
      9 #import "DependentComponentPickerViewController.h"
     10 
     11 #define kStateComponent 0
     12 #define kZipComponent 1
     13 
     14 @interface DependentComponentPickerViewController () <UIPickerViewDelegate, UIPickerViewDataSource>
     15 /** 依赖性滚轮 */
     16 @property (weak, nonatomic) IBOutlet UIPickerView *dependentPicker;
     17 
     18 // 滚轮数据
     19 @property (strong, nonatomic) NSDictionary *stateZips;
     20 /** 州名 */
     21 @property (strong, nonatomic) NSArray *states;
     22 /** 邮编 */
     23 @property (strong, nonatomic) NSArray *zips;
     24 
     25 @end
     26 
     27 @implementation DependentComponentPickerViewController
     28 
     29 - (void)viewDidLoad {
     30     [super viewDidLoad];
     31     // Do any additional setup after loading the view.
     32     // 获得应用资源包的引用并提取相应文件的资源路径
     33     NSBundle *bundle = [NSBundle mainBundle];
     34     NSURL *plistURL = [bundle URLForResource:@"statedictionary" withExtension:@"plist"];
     35     // 从资源文件导出数据
     36     self.stateZips = [NSDictionary dictionaryWithContentsOfURL:plistURL];
     37     // 字典所有键,按字母顺序排列
     38     NSArray *allStates = [self.stateZips allKeys];
     39     NSArray *sortedStates = [allStates sortedArrayUsingSelector:@selector(compare:)];
     40     self.states = sortedStates;
     41     
     42     NSString *selectedState = self.states[0];
     43     self.zips = self.stateZips[selectedState];
     44 }
     45 
     46 - (IBAction)selected:(UIButton *)sender {
     47     // 提取当前滚轮所选的数据
     48     NSInteger stateRow = [self.dependentPicker selectedRowInComponent:kStateComponent];
     49     NSInteger zipRow = [self.dependentPicker selectedRowInComponent:kZipComponent];
     50     NSString *state = self.states[stateRow];
     51     NSString *zip = self.zips[zipRow];
     52     // 警告框标题、警告信息
     53     NSString *title = [NSString stringWithFormat:@"You selected zip code %@.", zip];
     54     NSString *message = [NSString stringWithFormat:@"%@ is in %@", zip, state];
     55     
     56     UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
     57     
     58     UIAlertAction *action = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
     59     [alert addAction:action];
     60     [self presentViewController:alert animated:YES completion:nil];
     61     
     62 }
     63 
     64 #pragma mark -
     65 #pragma mark 选取器数据源
     66 #pragma mark 滚轮数
     67 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
     68     return 2;
     69 }
     70 #pragma mark 行数
     71 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
     72     if (component == kStateComponent) {
     73         return [self.states count];
     74     } else {
     75         return [self.zips count];
     76     }
     77 }
     78 
     79 #pragma mark - 选取器委托
     80 #pragma mark 行标题
     81 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
     82     if (component == kStateComponent) {
     83         return self.states[row];
     84     } else {
     85         return self.zips[row];
     86     }
     87 }
     88 #pragma mark 滚轮数据改变
     89 - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
     90     if (component == kStateComponent) {
     91         //
     92         NSString *selectedState = self.states[row];
     93         // 州对应的邮编集
     94         self.zips = self.stateZips[selectedState];
     95         
     96         // 重新加载邮编滚轮,默认选中邮编首行
     97         [self.dependentPicker reloadComponent:kZipComponent];
     98         [self.dependentPicker selectRow:0 inComponent:kZipComponent animated:YES];
     99         
    100     }
    101 }
    102 #pragma mark 滚轮的宽
    103 - (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
    104     CGFloat pickerWidth = pickerView.bounds.size.width;
    105     // 州滚轮占1/3、邮编滚轮占2/3
    106     if (component == kZipComponent) {
    107         return pickerWidth/3;
    108     } else {
    109         return 2 * pickerWidth/3;
    110     }
    111 }
    112 
    113 @end

    9. CustomPickerViewController.m

      1 //
      2 //  CustomPickerViewController.m
      3 //  7.1-创建Pickers应用程序
      4 //
      5 //  Created by LinKun on 16/7/16.
      6 //  Copyright © 2016年 Apress. All rights reserved.
      7 //
      8 
      9 #import "CustomPickerViewController.h"
     10 #import <AudioToolbox/AudioToolbox.h>
     11 
     12 @interface CustomPickerViewController () <UIPickerViewDelegate, UIPickerViewDataSource>
     13 /** 自定义滚轮 */
     14 @property (weak, nonatomic) IBOutlet UIPickerView *customPicker;
     15 /** 显示胜利结果的标签 */
     16 @property (weak, nonatomic) IBOutlet UILabel *winLabel;
     17 /** 游戏开始按钮 */
     18 @property (weak, nonatomic) IBOutlet UIButton *button;
     19 /** 数据:图片 */
     20 @property (strong, nonatomic) NSArray *images;
     21 // 声音
     22 @property (assign, nonatomic) SystemSoundID winSoundID;
     23 @property (assign, nonatomic) SystemSoundID crushSoundID;
     24 
     25 @end
     26 
     27 @implementation CustomPickerViewController
     28 
     29 - (void)viewDidLoad {
     30     [super viewDidLoad];
     31     // Do any additional setup after loading the view.
     32     // 加载数据
     33     self.images = @[[UIImage imageNamed:@"seven"],
     34                     [UIImage imageNamed:@"bar"],
     35                     [UIImage imageNamed:@"crown"],
     36                     [UIImage imageNamed:@"cherry"],
     37                     [UIImage imageNamed:@"lemon"],
     38                     [UIImage imageNamed:@"apple"]];
     39     
     40     // 游戏开始初始化结果框为空
     41     self.winLabel.text = @" ";
     42 }
     43 
     44 #pragma mark - 游戏逻辑
     45 - (IBAction)spin:(UIButton *)sender {
     46     BOOL win = NO;
     47     /** 保存连续相同的图片的个数 */
     48     int numInRow = 1;
     49     /** 前一张图片索引 */
     50     int lastVal = -1;
     51     
     52     for (int i = 0; i < 5; i++) {
     53         /** 随机选择一张图片索引作为当前图片索引 */
     54         int newValue = arc4random_uniform((uint)[self.images count]);
     55         if (newValue == lastVal) {
     56             numInRow++;
     57         } else {
     58             numInRow = 1;
     59         }
     60         lastVal = newValue;
     61         
     62         // 选取器滚动到新值
     63         [self.customPicker selectRow:newValue inComponent:i animated:YES];
     64         [self.customPicker reloadComponent:i];
     65         if (numInRow >= 3) {
     66             win = YES;
     67         }
     68     }
     69     
     70     if (_crushSoundID == 0) {
     71         NSString *path = [[NSBundle mainBundle] pathForResource:@"crunch" ofType:@"wav"];
     72         NSURL *soundURL = [NSURL fileURLWithPath:path];
     73         AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundURL, &_crushSoundID);
     74     }
     75     AudioServicesPlaySystemSound(_crushSoundID);
     76     if (win) {
     77         [self performSelector:@selector(playWinSound) withObject:nil afterDelay:.5];
     78         
     79     } else {
     80         [self performSelector:@selector(showButton) withObject:nil afterDelay:.5];
     81     }
     82     self.button.hidden = YES;
     83     self.winLabel.text = @" ";
     84 }
     85 
     86 #pragma mark -
     87 #pragma mark 数据源
     88 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
     89     return 5;
     90 }
     91 
     92 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
     93     return [self.images count];
     94 }
     95 
     96 #pragma mark - 选取器委托
     97 #pragma mark 行视图数据
     98 - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
     99     UIImage *image = self.images[row];
    100     UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    101     return imageView;
    102 }
    103 #pragma mark 滚轮行高
    104 - (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component {
    105     return 100;
    106 }
    107 #pragma mark - 隐藏按钮
    108 - (void)showButton {
    109     self.button.hidden = NO;
    110 }
    111 #pragma mark - 播放声音
    112 - (void)playWinSound {
    113     if (_winSoundID == 0) {
    114         NSURL *soundURL = [[NSBundle mainBundle] URLForResource:@"win" withExtension:@"wav"];
    115         AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundURL, &_winSoundID);
    116     }
    117     AudioServicesPlaySystemSound(_winSoundID);
    118     self.winLabel.text = @"WINNER!";
    119     [self performSelector:@selector(showButton) withObject:nil afterDelay:1.5];
    120 }
    121 
    122 @end
  • 相关阅读:
    Echart 动态生成series数据
    转换Excel格式
    .NET接收邮件下载邮件附件——openpop.net
    百度Echart 地图
    mobiscroll 日期问题
    jQuery自动完成插件flexselect
    HTML5 video 连续播放视频
    team foundation server 工具的使用
    实现主成分分析与白化
    白化(预处理步骤)【转】
  • 原文地址:https://www.cnblogs.com/gzhu-lkun/p/5815408.html
Copyright © 2011-2022 走看看