標籤:
一、點菜
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]
iOS基礎-UIKit架構-進階視圖-UIPickerView-執行個體1:點菜(列與列之間無關係)