iOS开发中使用Picker View实现一个点菜应用的UI示例


一、实现效果

  说明:点击随机按钮,能够自动选取,下方数据自动刷新。

二、实现思路

1.picker view的有默认高度为162,不可修改。
2.显示数据,需要设置数据源,也有两种方式(成为数据源,遵守协议)
3.实现数据源里面的两个方法
1)返回一共有多少列
2)在这一列中一共有多少行
4.通过代理告诉它那一列的哪一行显示哪些数据(设置其代理为控制器)
5.使用懒加载,加载所有的食物
6.完成基本数据的展示(列,行,内容)
7.自动更新选中的食物信息。(使用一个大的view,上面放6个label)
1)给3个lab赋值,添加三个属性(水果,主菜,饮料)
2)监听选中了哪一行(监听有两种思想,一个是代理,一个是通知),先查看有没有代理的方法(didselectRow)这个方法当选中了某一行的的时候调用,会将选中的列号和行号当做参数传入进去。能够获取到对应的列号和行号。
3)完成选中时调用的监听方法
4)在viewdidload里面设置默认选中的内容,设置为[0][1]
5)提高可扩展性(手动的调用那几行-使用一个for循环)
8.随机功能的实现
1)怎么让代码选中某一行(selectrow),调用该方法可以指定让它滚动到那一列的哪一行
2)实现头部的功能(使用一个大的uiview,里面放两个子控件)
3)设置高度44,怎么让随机按钮的位置居中?可以设置它的高度为44,最大的Y值为64。
4)设置随机按钮的点击事件randomFood,让pickerview主动选中某一行。
5)生成随机数的方法(生成随机数的限制,不超过当前的总数)
6)缺点,将来数据改变之后,会报错(模于几)[self.foods[0] count]?为什么不用简写 点语法?(切记要记住)
7)随机数的处理不严谨,有的时候生成的随机数可能是相等的,那么这样的话列就不会滚动,获取到对应列的数据总数,如何拿到上一次产生的随机值(也就是当前选中的行),比较上一次的行号和当前生成的随机数是否相同,如果相同则重写生成
9.解决另外一个问题,下面的数据随机刷新失效了,通过代码选中某一行。
 
三、实现代码示例
1.项目文档结构和storyboard文件

storyboard文件大的界面设置:

2.代码示例
主控制器文件代码:

复制代码 代码如下:

//
//  YYViewController.m
//  06-简单选菜系统的实现
//
//  Created by apple on 14-6-5.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"

//遵守数据源和代理协议
@interface YYViewController ()<UIPickerViewDataSource,UIPickerViewDelegate>
/**
 *  水果
 */
@property (strong, nonatomic) IBOutlet UILabel *fruitLab;
/**
 *  主菜
 */
@property (strong, nonatomic) IBOutlet UILabel *stapleLab;
/**
 *  饮料
 */
@property (strong, nonatomic) IBOutlet UILabel *drinkLab;
/**
 *  保存所有的数据
 */
@property(nonatomic,strong)NSArray *foods;
@property (weak, nonatomic) IBOutlet UIPickerView *pickerView;
- (IBAction)randomFood:(id)sender;

@end


复制代码 代码如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    //在这里设置下方数据刷新部分的初始显示
    for (int component = 0; component<self.foods.count; component++) {
        [self pickerView:nil didSelectRow:0 inComponent:component];
    }
}

#pragma mark-使用懒加载,把数据信息加载进来
-(NSArray *)foods
{
    if (_foods==nil) {
        NSString *fullpath=[[NSBundle mainBundle]pathForResource:@"foods.plist" ofType:nil];
        NSArray *arrayM=[NSArray arrayWithContentsOfFile:fullpath];
        _foods=arrayM;
    }
    return _foods;
}

#pragma mark-处理随机按钮的点击事件
- (IBAction)randomFood:(id)sender {
   
    // 让pickerView主动选中某一行
    // 让pickerView选中inComponent列的Row行
    //    [self.pickerView selectRow:1 inComponent:0 animated:YES];
   
    /*
     [self.pickerView selectRow: arc4random() % 12 inComponent:0 animated:YES];
     [self.pickerView selectRow: arc4random() % 15 inComponent:1 animated:YES];
     [self.pickerView selectRow: arc4random() % 10 inComponent:2 animated:YES];
     */
   
    //    [self.foods objectAtIndex:0]; == self.foods[0];
    //    [self.foods[0] count];
   
    /*
     // 根据每一列的元素个数生成随机值
     [self.pickerView selectRow: arc4random() % [self.foods[0] count] inComponent:0 animated:YES];
     [self.pickerView selectRow: arc4random() % [self.foods[1] count] inComponent:1 animated:YES];
     [self.pickerView selectRow: arc4random() % [self.foods[2] count] inComponent:2 animated:YES];
     */
   
    //设置一个随机数
    for (int component=0; component<self.foods.count; component++) {
        //获取当前列对应的数据元素的个数
        int total=[self.foods[component] count];
        //根据每一列的总数生成随机数(当前生成的随机数)
        int randomNumber=arc4random()%total;
       
        //获取当前选中的行(上一次随机后移动到的行)
        int oldRow=[self.pickerView selectedRowInComponent:0];
       
        //比较上一次的行号和当前生成的随机数是否相同,如果相同的话则重新生成
        while (oldRow==randomNumber) {
                randomNumber=arc4random()%total;
        }
       
        //让pickerview滚动到指定的某一行
        [self.pickerView selectRow:randomNumber inComponent:component animated:YES];
        //模拟,通过代码选中某一行
        [self pickerView:nil didSelectRow:randomNumber inComponent:component];
    }
}

#pragma mark- 设置数据
//一共多少列
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return self.foods.count;
}

//每列对应多少行
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    //1.获取当前的列
    NSArray *arayM= self.foods[component];
    //2.返回当前列对应的行数
    return arayM.count;
}

//每列每行对应显示的数据是什么
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    //1.获取当前的列
    NSArray *arayM= self.foods[component];
    //2.获取当前列对应的行的数据
    NSString *name=arayM[row];
    return name;
}

#pragma mark-设置下方的数据刷新
// 当选中了pickerView的某一行的时候调用
// 会将选中的列号和行号作为参数传入
// 只有通过手指选中某一行的时候才会调用
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    //获取对应列,对应行的数据
    NSString *name=self.foods[component][row];
    //赋值
    if (0==component) {
        self.fruitLab.text=name;
    }else if(1==component)
    {
        self.stapleLab.text=name;
    }else
        self.drinkLab.text=name;
}

#pragma mark-隐藏状态栏
-(BOOL)prefersStatusBarHidden
{
    return YES;
}
@end


四、重要补充

请注意在代码实现中为什么使用 [self.foods[0] count]; 而不是直接使用点语法self.foods[0].count取值。    

[self.foods objectAtIndex:0]; == self.foods[0];//这两句的效果等价,而self调用objectAtIndex:0这个方法,返回的是一个id类型的万能指针,它的真实类型要到实际运行的时候才能检测得到,因此不能直接使用self.foods[0].count。



相关阅读:
快速掌握Node.js模块封装及使用
JavaScript基础知识及常用方法总结
jQuery通用的全局遍历方法$.each()用法实例
C#中重载与重写区别分析
JSP经典学习笔记(包含各种入门常用语法)
Win10 Mobile build 10536简单视频上手 性能提升/修复免打扰模式等
每天一篇javascript学习小结(Boolean对象)
浅析json与jsonp区别及通过ajax获得json数据后格式的转换
用HTML5实现手机摇一摇的功能的教程
js实现鼠标感应向下滑动隐藏菜单的方法
Android下拉刷新控件SwipeRefreshLayout源码解析
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
C#调用mmpeg进行各种视频转换的类实例
深入解析Java编程中的boolean对象的运用
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 《还珠格格》最经典的台词语录大集合 侯以雷诗歌欣赏 考试的一天 2012.3.3第一次的约会! 监狱警察培训心得体会 春运商机你千万不能错过 与爱情无关的一种伴侣 学校后备干部工作总结 离别之后才怀念那份真诚的友谊 简析leehom的《柴米油盐酱醋茶》 个人演奏会主持词 1435的遐想 视频推广方案 写古代勤奋读书的故事 魔法师胖大海 为了你我爱记歌词 2015七一表彰大会校长讲话稿 弹钢琴的小姑娘作文100字 最爱人间四月天 2015石嘴山高考满分作文及题目 让党旗永远飘扬 让形象永远闪亮 演讲稿 学校里的那些人儿 简政放权实施方案 2016幼儿园工作总结 无声,问候 春天的童话550字 观电影《深渊》后感800字 400字英语演讲稿:Never Say Die 我爱梧桐树作文250字 关于家教的广告语 青涩的初恋,去了,还能回来么?痛苦的等待着她的回答 2014婚礼全流程及主持人主持词 我最大的理想作文500字 仿写的《我爱你啊,中国》片段 有趣的社团活动 秋天的桂花的作文400字 第十九章那辆偷情车 小学六年级作文500字:绿色 计算机系辩论队招募策划 初一繁星春水读后感 人教版七年级下册二单元作文:黄河,我爱你 中学教师师德师风建设学习心得 县下半年安全生产工作会议讲话 樱花之恋(二) 恋湖家园作文300字 描写平安夜礼物的作文优秀范文精选 公司网站策划书范文 用安慰造句_安慰的近义词 复习计划

Copyright © 2016 phpStudy |