博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发 点菜系统 使用UIPickerView
阅读量:5283 次
发布时间:2019-06-14

本文共 2980 字,大约阅读时间需要 9 分钟。

利用UIPickerView实现一个简单的点菜界面,如下图所示。源码地址:

UIPickerView有两个协议UIPickerViewDataSource,UIPickerViewDelegate,它们为UIPickeView提供数据和代理。UIPickeView的三个component分别代表fruit,main,drink,选中某一行,菜名在下面显示。最上面的随机按钮,则实现随机点菜功能。

1.viewController实现两个协议,并且引用相关数据和控件。

@interface CsyViewController () 
@property (strong,nonatomic) NSArray *foodGroups;@property (weak, nonatomic) IBOutlet UIPickerView *picker;@property (weak, nonatomic) IBOutlet UILabel *fruitLabel;@property (weak, nonatomic) IBOutlet UILabel *mainLabel;@property (weak, nonatomic) IBOutlet UILabel *drinkLabel;@property (weak, nonatomic) IBOutlet UIButton *randBtn;@end

2.数据保存在plist文件中,由foodGroup引用,并且使用懒加载读取数据。

//重写getter方法,懒加载实现- (NSArray *)foodGroups{    if (!_foodGroups) {        NSString *path = [[NSBundle mainBundle] pathForResource:@"foods.plist" ofType:nil];                _foodGroups = [NSArray arrayWithContentsOfFile:path];    }        return _foodGroups;    }

3.UIPickerViewDataSource提供的相关信息:component数以及每个component有多少行

#pragma mark -- UIPickerViewDataSource//返回component数- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{    return self.foodGroups.count;}//返回每个component有多少行- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{    return [self.foodGroups[component] count];}

4.UIPickerViewDelegate提供每一行显示的数据。

#pragma mark -- UIPickerViewDelegate//每一行显示的数据,字符串数据- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{    return self.foodGroups[component][row];}

5.在UIPickerView选中某一行后,需要动态更改下方的菜名。这个是通过UIPickerViewDelegate协议的didSelectRow:方法实现的,当选中某一行,会自动调用该方法。即在该方法中动态地改变菜名。

- (void)viewDidLoad{    [super viewDidLoad];//    for (NSArray *group in self.foodGroups) {//        CsyLog(@"%@",group);//    }        //初始化三个label,菜单名    for (int i = 0; i < self.foodGroups.count; i++) {        [self pickerView:self.picker didSelectRow:4 inComponent:i];    }    //    NSInteger row = [self.picker selectedRowInComponent:0];//    CsyLog(@"selected row = %d",row);        //监听方法    [self.randBtn addTarget:self action:@selector(randBtnDidClick:) forControlEvents:UIControlEventTouchUpInside];        }#pragma mark --randBtn Listener- (void)randBtnDidClick:(UIButton *)button{//    CsyLog(@"click");        for (int i = 0; i < self.foodGroups.count; i++) {        NSArray *group = self.foodGroups[i];        NSInteger newRow = arc4random() % group.count;        //之前被选中的行        NSInteger currentRow = [self.picker selectedRowInComponent:i];//        NSLog(@"currentRow = %d",currentRow);        //如果随机值和当前的值相当,随机的值加1        if (newRow == currentRow) {            newRow = (newRow + 1) % group.count;        }//        NSLog(@"newRow = %d",newRow);        //选中某行某列        [self.picker selectRow:newRow inComponent:i animated:YES];        //调用didSecled方法,更新三个label        [self pickerView:self.picker didSelectRow:newRow inComponent:i];    }        }

转载于:https://www.cnblogs.com/csy8752316/p/3768966.html

你可能感兴趣的文章
数组分割问题求两个子数组的和差值的小
查看>>
composer 报 zlib_decode(): data error
查看>>
hdu 3938 并查集
查看>>
《深入分析Java Web技术内幕》读书笔记之JVM内存管理
查看>>
python之GIL release (I/O open(file) socket time.sleep)
查看>>
161017、SQL必备知识点
查看>>
kill新号专题
查看>>
MVC学习系列——Model验证扩展
查看>>
字符串
查看>>
vue2.x directive - 限制input只能输入正整数
查看>>
实现MyLinkedList类深入理解LinkedList
查看>>
自定义返回模型
查看>>
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>
打飞机游戏【来源于Crossin的编程教室 http://chuansong.me/account/crossincode 】
查看>>
[LeetCode] Merge Intervals
查看>>
【翻译自mos文章】当点击完 finishbutton后,dbca 或者dbua hang住
查看>>
Linux编程简介——gcc
查看>>
2019年春季学期第四周作业
查看>>
MVC4.0 利用IActionFilter实现简单的后台操作日志功能
查看>>