iOS基础-UIKit框架-高级视图-UIPickerView-实例1:点菜(列与列之间无关系)

一、点菜
0.创建一个plist文件,Root为Array,里面包含3个数组,每个数组有一堆食物名称
加载这个plist文件
1>声明数组属性
@property(nonatomic,strong)NSArray *foods;
2>懒加载(在实现文件最后面)
#pragma mark - 懒加载
-(NSArray *)foods
{
if(_foods == nil){
NSString *fullPath = [[NSBundle mainBundle] pathForResource:@"foods.plist" ofType:nil];
_foods = [NSArray arrayWithContentsOfFile:fullPath];
}
return _foods;
}

1.拖一个Picker View控件,点右键将数据源设置为控制器

2.遵从数据源协议并实现数据源方法
#pragma mark - 数据源方法
//返回pickerView一共有多少列
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return self.foods.count;
}

//返回pickerView第component列有多少行
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponents:(NSInteger)component
{
return self.foods[components].count;
}

3.在Picker View控件上点右键将代理设置为控制器

4.遵从代理协议并实现代理方法
#pragma mark - 代理方法
//返回第component列的第row行显示什么内容
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponents:(NSInteger)component
{
return self.foods[components][row];
}

二、显示点菜结果
1.拖一个View,并在这个View上拖6个标签,并将随滚动变化的标签连线
2.实现一个代理方法(监听选中行)
#pragma mark - 代理方法
//当选中了pickerView的某一行的时候调用
//会将选中的列号和行号作为参数传入
//只有通过手指选中某一行的时候才会调用
-(void)pikerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
//1.获取对应列对应行的数据
NSString *name = self.foods[component][row];
//2.判断选择的是哪一列,根据列号设置对应的数据
if(0 == component){
//水果
self.fruitLabel.text = name;
} else if (1 == component)
{
//主菜
self.stapleLabel.text = name;
}else
{
//饮料
self.drinkLabel.text = name;
   }
}
3.在ViewDidLoad里设置显示的默认值(模拟手动选中)
for (int component = 0; component<self.foods.count;component++)
{
    [self pcikerView:nil didSelectRow:0 inComponent:component];
}

三、随机选菜
1.拖一个View(高度为64,包括状态栏的20),在上面拖1个按钮和1个标签
//居中小技巧:Y为64,(和高度一样),高度为44.
2.监听按钮点击(连线并实现方法)
.//这里要拿到pickerView,调用它的方法,所以先将pickerView连线(Outlet)。
#pragma mark - 监听按钮点击
-(IBAction)randomFood:(UIButton *)sender{
//让pickerView主动选中某一行
//让pickerView选中inComponent列的Row行
//根据每一列的元素个数生成随机值
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;
}

//让pickerVier滚动到某一行
[self.pickerView selectRow:randomNumber inComponent:component animated:YES];

//通过代码选中某一行
[self pcikerView:nil didSelectRow:randomNumber inComponent:component];
}
//% 12则永远是[0,11],其他同理,也就是说,有几个数就%几

问:为什么不用self.foods[0].count而用[self.foods[2] count] ?
答:因为self.foods[0] == [self.foods objectAtIndex:0];
而objectAtIndex:方法的返回值是id,id是动态类型,只有运行的时候才知道是什么类型,动态类型没有count方法,所以不能这样调用。而是采取老土的方法[self.foods[2] count]

时间: 2024-08-07 14:53:03

iOS基础-UIKit框架-高级视图-UIPickerView-实例1:点菜(列与列之间无关系)的相关文章

iOS基础-UIKit框架-高级视图-UIPickerView-实例3:国家选择(图片)

说明:事先已经准备好了一个NJCountry类,里面声明了2个属性name和icon,并 创建和实现了快速创建类的动态方法和静态方法.直接导入即可.0.创建一个plist文件,Root为Array,里面为字典(字典里为国家和国旗)1.加载这个plist文件1>声明数组属性 @property(nonatomic,strong)NSArray *countries:2>懒加载(在实现文件最后面)#pragma mark - 懒加载-(NSArray *)countries{if(_countri

iOS基础-UIKit框架-高级视图-UIPickerView-实例2:城市选择(列与列之间有关系)

说明:事先已经准备好了一个NJProvince类,里面声明了2个属性name和cities,并创建和实现了快速创建类的动态方法和静态方法.直接导入即可.0.创建一个plist文件,Root为Array,里面为字典(字典里为省份和城市)1.加载这个plist文件1>声明数组属性 @property(nonatomic,strong)NSArray *provinces:2>懒加载(在实现文件最后面)#pragma mark - 懒加载-(NSArray *)provinces{ if(_prov

iOS基础-UIKit框架-基础视图-UIScrollView

一.什么是UIScrollView? 二.UIScrollView的基本使用

iOS基础-UIKit框架-多控制器管理-UINavigationController

一.导航控制器基本使用多控制器 导航控制器 导航控制器的简单使用1.创建一个空项目2.创建导航控制器nav3.设置导航控制器为Window的根控制器4.新建3个控制器类管理这3个View(勾上also create xib)在xib中添加一个标签用来注明是第几个控制器,添加一个按钮用来跳转到下一个控制器5.创建第一个控制器并添加到导航控制器中[nav pushViewController:one animated:YES]:6.监听用来跳转到第二个的按钮并实现方法-(IBAction)jump2

iOS基础-UIKit框架-多控制器管理-UITabBarController

UITabBarController UITabBarController的简单使用 一.UITabBarController的创建(利用代码)1.新建一个空项目,在MJAppDelegate.m的didFinishLaunch...方法中//1.创建tabbar控制器UITabBarController *tabbarVc = [[UITabBarController alloc] init]: //2.设置为window的根控制器self.window.rootViewController

iOS基础-UIKit框架-多控制器管理-Segue

一.什么是Segue? 二.Segue的属性 三.Segue的类型 四.自动型Segue(控件->控制器) 五.手动型Segue(控制器->控制器) 六.performSegueWithIdentifier:sender:

iOS基础-UIKit框架-多控制器管理-控制器创建和控制器view的创建

掌握 一.控制器的多种创建方式如何创建一个控制器 通过storyboard创建注意:加载UIStoryboard仅仅是加载名称叫做Test的storyboard,并不会创建 storyboard中的控制器以及控件 通过xib创建注意:要想让xib里的view设置为所创建控制器的view,必须设置xib的File's owner 为所创建控制器.并且File's owner点右键将view连到xib里的view上.storyboard默认已经完成了上述操作 二.控制器view的创建方式1.没有同名

iOS基础-UIKit框架-多控制器管理-Modal

Modal Modal效果 一.Modal演示(代码)1.事前准备1>新建一个空项目,删除默认控制器文件2>自定义2个控制器,将ViewController的Class分别设置为这个类3>创建一个window,将其根控制器设置为第一个自定义的控制器.2.拖一个按钮,监听这个按钮并实现方法(用来跳转到第二个界面)-(IBAction)jump{ //展示第二个控制器界面 MJTwoController *two = [[MJTwoViewController alloc] init]: [

实例对象、构造函数、原型之间的关系

实例对象.构造函数和原型之间的关系 实例对象 实例对象中只有__proto__属性,所有的实例都指向自己构造函数的原型.__proto__属性里面有构造器construction和__proto__. 构造器指向原型所属的构造函数,__proto__属性指向Object的原型. 实例对象里面有一个特例: 这个是一个特例,里面有prototype和__proto__俩个属性,__proto__指向Function的原型,prototype是一个单纯的对象,是一个Object的实例,相当于{},就是