我正在设置 aUIPickerView
以提供诸如选项 a、选项 b、选项 c等选项。我试图解释来自 Apple 的示例代码,但对于像我这样的初学者来说似乎很难理解。如果可能的话,我还希望选择器视图中的选项将我带到另一个页面。
3 回答
很明显,对于每个初学者来说,第一次理解这些东西是有些乏味的。
无论如何,你知道如何使用UITableView
s 吗?你知道如何使用UITableViewDelegate
和UITableViewDataSource
吗?如果你的答案是肯定的,那么想象UIPickerView
s 就像UITableView
s(但记住它们不是UITableViewController
s)。
假设,我有一个UIPickerView
:
UIPickerView *objPickerView = [UIPickerView new]; // You need to set frame or other properties and add to your view...you can either use XIB code...
1)首先,您需要通过 IB 或代码将delegate
and分配dataSource
给。UIPickerView
这取决于您的实现(所以这一步看起来与 a 非常相似UITableView
,不是吗?)
像这样:
objPickerView.delegate = self; // Also, can be done from IB, if you're using
objPickerView.dataSource = self;// Also, can be done from IB, if you're using
2)接下来,您需要定义部分的数量,如下所示:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView {
return 1; // Or return whatever as you intend
}
2)然后你需要定义你需要的行数:
- (NSInteger)pickerView:(UIPickerView *)thePickerView
numberOfRowsInComponent:(NSInteger)component {
return 3;//Or, return as suitable for you...normally we use array for dynamic
}
3)然后,为行定义标题(如果您有多个部分,则为每个部分定义标题):
- (NSString *)pickerView:(UIPickerView *)thePickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [NSString stringWithFormat:@"Choice-%d",row];//Or, your suitable title; like Choice-a, etc.
}
4)接下来,您需要在有人单击元素时获取事件(当您要导航到其他控制器/屏幕时):
- (void)pickerView:(UIPickerView *)thePickerView
didSelectRow:(NSInteger)row
inComponent:(NSInteger)component {
//Here, like the table view you can get the each section of each row if you've multiple sections
NSLog(@"Selected Color: %@. Index of selected color: %i",
[arrayColors objectAtIndex:row], row);
//Now, if you want to navigate then;
// Say, OtherViewController is the controller, where you want to navigate:
OtherViewController *objOtherViewController = [OtherViewController new];
[self.navigationController pushViewController:objOtherViewController animated:YES];
}
这就是您需要的所有实现。
我将简要解释如何以编程方式实现这一目标
- (void)viewDidLoad {
[super viewDidLoad];
UIPickerView * picker = [UIPickerView new];
picker.delegate = self;
picker.dataSource = self;
picker.showsSelectionIndicator = YES;
[self.view addSubview:picker];
}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
return 3;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
NSString * title = nil;
switch(row) {
case 0:
title = @"a";
break;
case 1:
title = @"b";
break;
case 2:
title = @"c";
break;
}
return title;
}
基本上在viewDidLoad
我们正在创建并向UIPickerView
视图添加一个,告诉它我们的控制器同时用作delegate
和dataSource
(您也可以在 Interface Builder 中执行此操作)
然后我们正在实现两个数据源方法,以分别告诉 pickerView 有多少组件以及每个组件有多少行,numberOfComponentsinPickerView:
以及pickerView:numberOfRowsInComponent:
最后,我们实现了pickerView:titleForRow:forComponent:
返回每一行内容的委托方法。
如果您想在选择一行时自定义行为,您可以实现委托方法pickerView:didSelectRow:inComponent:
——顾名思义——每次选择一行时都会调用该方法。
UIPickerView 使用的部分类似于 UITableView 的使用。DataSource
和Delegate
协议。
这些DataSource
方法用于告诉选择器您的选择器中有多少“列”和多少“行”。
其余的Delegate
方法是行高、列宽、要显示的视图或标题,以及在选择器移动时回调。
UIPickerView