在iPhone应用程序中展开和收回下拉列表
我正在着手开发一款iPhone应用程序。我需要提供一个下拉框,供客户选择一个值,该值在提交时基本上会发送到下游数据库。很明显,我使用了一个在iPhone应用程序中展开和收回下拉列表,iphone,drop-down-menu,uipickerview,Iphone,Drop Down Menu,Uipickerview,我正在着手开发一款iPhone应用程序。我需要提供一个下拉框,供客户选择一个值,该值在提交时基本上会发送到下游数据库。很明显,我使用了一个UIPickerView作为下拉列表,它是从IB构建的 加载“我的视图”后,将启用下拉列表,并显示所有值 问题是: 我只能在单击下拉列表后将其展开吗 一旦用户选择一个值,我可以收回列表吗 我认为下拉列表非常以网络为中心,但我可能完全错了。您有几个选择: 对于初学者来说,可能最简单的方法是:推送一个新视图(作为模式视图或导航堆栈),该视图将列表显示为单击所需项目
UIPickerView
作为下拉列表,它是从IB构建的
加载“我的视图”后,将启用下拉列表,并显示所有值
问题是:
我认为下拉列表非常以网络为中心,但我可能完全错了。您有几个选择:
视图控制器需要实现UIPickerViewDataSource以及UIPickerViewDelegate。在UIPickerView的XIB中,您需要将文件的所有者与UIPickerView的委托和数据源链接起来 与在UITableDataSource中一样,您需要提供[numberOfComponentsInPickerView]中的组件数量(表:部分)。然后您需要在[numberOfRowsInComponent]中为每个组件提供行数。最后,您需要为[titleForRow]中的每个条目提供标题 现在,如果选择了上一个组件,您可以使用[didSelectRow]加载下一个组件,让所有内容都变得生动起来 注意:UIPickerView有一个小错误,在填充/更改组件时不能调用[didSelectRow]。为了使它工作更顺利,我添加了一个“None”条目作为第一个条目,这是一个非选择项,不会导致加载下一个组件 这是一个基本代码:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 3; // Number of Components aka Columns
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
if( component == 0 ) {
return [self.firstColumnEntries count] + 1;
} else if( component == 1 ) {
return [self.secondColumnEntries count] + 1;
} else if( component == 2 ) {
return [self.thirdColumnEntries count] + 1;
}
return 0;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
NSLog( @"titleForRow(), component: %d, row: %d", component, row );
NSDictionary *item = nil;
if( row == 0 ) {
return @" --- ";
} else {
int correctedRow = row - 1;
if( component == 0 ) {
item = [self.firstColumnEntries objectAtIndex:correctedRow];
} else if( component == 1 ) {
item = [self.secondColumnEntries objectAtIndex:correctedRow];
} else if( component == 2 ) {
item = [self.thirdColumnEntries objectAtIndex:correctedRow];
}
return [item objectForKey:@"name"]; // My objects are NSDictionarys
}
}
- (void) pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
DLog( @"SSVC.didSelectRow(), component: %d, row: %d", component, row );
ActionRequest *action = nil;
if( row == 0 ) {
if( component == 0 ) {
[self refreshFirstColumn:self.firstColumnEntries];
} else if( component == 1 ) {
...
}
} else {
// Last Column is selected. Now selection is complete
...
}
}
由于UIPickerView占用了大量空间,并且您无法更改其大小,因此我建议将其放置在其他UIView上(使其余部分透明),并在用户选择分配给该值的字段(UITextField)时显示它。选择完成后(选择最后一个值或用户输入按钮时),可以让视图消失,并将值设置到UITextField。确保无法编辑UITEXT字段,并且输入该字段会显示带有选择器视图的视图。完成后,请确保也移动到下一个字段