一、之前我们讲到哪里
1)首先,是搭建界面
2)然后呢,是加载数据
先把这个数据文件,拖进来,然后呢,设置它的代理对象、数据源对象
然后呢,在控制器里面,遵守对应的协议,
实现对应的方法
跟TableView的思路,一样一样的,
也是,把多少行返回
把多少组,返回
然后呢,每组多少行
然后呢,每一行显示什么内容
3)然后呢,是不是随机点餐,接下来,就是随机点餐吧
先呢,给它拖一根线
拖一个事件,在这个事件里面呢,遍历所有的数据,遍历多少组
i呢,就是对应的,第一组、第二组、第三组
然后呢,把这一组的数据,让它去随机选中
1.接下来呢,是将数据显示到Label上,
在这个Main.storyboard里面,这个Label的约束,距离左边这个,
这里的话,有一个快捷键,叫做:按住Control键,然后呢,拖过来
这个Horizontal Spacing
就是与水平之间的间距
还有一个Vertical Spacing,就在我们下面
按住Control键,拖过去,设置一个水平间距
但是,这个水平间距的话,你能知道是多少吗,
不知道吧
如果你把这个Label呢,放到这里,
这时候,按住Control键,拖过来
那你再添加一个水平间距,这时候呢,你的Label的间距,就是这么远了
这个水平间距的话,你放哪儿,它就是哪儿,
如果你这个Label左边的间距,必须让它为20,这个时候,你就不能这么去拖了,你选中这个Label,添加一下约束
把这个勾去掉,它距离左边的约束,
距离左边“水果”这个Label,固定一下它的约束,是多少,
就可以确定,它是多少
2.“随机点餐”按钮
这个拖线,
我按住Control键,把它拖到类扩展里面了,
我们也可以,按住Control键,拖到下面
就可以拖出一个事件
拖到下面,以后,看上面,Connection,直接是一个Action
也就是说,你拖到下面,这个类实现里面呢,直接就可以生成一个方法
但是呢,如果你按住Control键,拖到上面的时候,
这个时候,上面这个Connection,你是不是就可以选了
可选的:Outlet、Action
我们常用的呢,就是这两个
Outlet是什么,对应的属性,
Action是什么,对应的方法
而且,你如果拖到声明里面,在声明和实现里面,会有这两个方法,同时存在
如果你拖到实现呢,就只有一个了
3.让这个Label显示PickerView的内容
我们现在已经实现了,让这个PickerView,随机选中了
但是呢,它的数据,有没有显示出来
command + R,我们再看一下啊
点击:随机点餐
奇异果、肉夹馍、茶饮料
榴莲、水煮肉片、果蔬汁
不一致吧
是不是没有选中
虽然你这个PickerView,是选中数据了
但是呢,你没有把这个文字,给我显示到Label上
所以呢,这可以怎么办,是不是也可以手动调用一下这个选中事件,让它去选一下
然后,它的行呢
就是这个随机的行
然后呢,它的列呢,就是这个i,
大家说,怎么写,
调用它的didSelect方法
然后呢,把这个pickerView,给它传进来
然后呢,选中的行,是什么,就是随机的行
然后呢,列呢,就是i
然后呢
command + R
是不是有了
二、还有一个小问题,我们看一下示例程序
1.是不是,每次点击“随机点餐”这个按钮,每一次你这个数据都在变,没有重复的吧
我们现在写的这个程序,点击“随机点餐”,
什么情况,梅菜扣肉,变了吗
有时候,它会有一个数据,或者两个数据,不变
所以说,现在我们就要把这个优化一下
每次点击“随机点餐”,这三样,都给我变一下
回到控制器里面,先给大家说一下
pickerView里面,有一个方法
selectedRowInComponent:(NSInteger)
这个是什么意思呢,就是获取你在当前组中选中的那一行啊,
我这儿直接写i
什么意思啊,就是说,你在i组,选中的行啊,
然后呢,之所以会没有变化,是不是因为,它的随机数,跟我们当前选中的行,是一样的,所以呢,它就不滚动了,是不是
那怎么办,你是不是就要判断一下,你当前选中的行,跟这个随机数,一样不一样
如果一样,是不是重新生成啊
如果不一样呢,是不是就可以用了
我们是不是直接就可以根据它,去获取了,
//获取第i组当前选中的行
[self.pickerView selectedRowInComponent:I];
选中的行,是什么呢,我们看一下它的返回值类型
按一下Esc键,
是不是有了,NSInteger,
用NSInteger接一下
NSInteger selRowNum = [self.pickerView selectedRowInComponent:I];
然后呢,我要判断,当前,选中的行,跟这个随机数,一样不一样,
而且呢,一样的话,是不是又要重复生成,
然后呢,我是要判断,用什么判断,
while(condition){
statements
}
直接用一个while循环,如果你这两个数,是相等的,你就直接继续生成,
是不是直接可以在这里边写了,
//如果随机数,与当前选中的行号一致,需要重新生成随机数
while(selRowNum == ranNum){
ranNum = arc4random_uniform((int)count);