我开始开发iPhone应用程序。我需要提供一个下拉框,供客户选择一个值,该值在提交时将基本上下行发送到数据库。我显然使用UIPickerView
作为从IB构建的下拉列表。
加载视图后,系统会启用下拉列表,并显示所有值。
问题是:
我认为在下拉方面非常以网络为中心,但我可能会把这一切都弄错。
答案 0 :(得分:1)
您的视图控制器需要实现 UIPickerViewDataSource 以及 UIPickerViewDelegate 。在UIPickerView的XIB中,您需要将文件所有者与UIPickerView的委托和数据源链接。
与UITabelDataSource类似,您需要在 [numberOfComponentsInPickerView] 中提供组件数量(表格:部分)。然后,您需要在 [numberOfRowsInComponent] 中提供每个组件的行数。最后,您需要为 [titleForRow] 中的每个条目提供标题。
现在要实现一切,您可以使用 [didSelectRow] 加载下一个组件(如果选择了上一个组件)。
注意: UIPickerView有一个小错误,当组件被填充/更改时,不能调用 [didSelectRow] 。为了使其更顺利地工作,我添加了一个“无”条目作为第一个条目,它是一个非选择条目,并且不会导致下一个组件被加载。
这是一个基本代码:
- (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)。选择完成后(无论是选择最后一个值还是用户输入按钮时),都会让View消失,并将值设置到UITextField上。确保无法编辑UITextField,并且输入UITextField会显示带有Picker View的View。完成后,请确保您也移动到下一个字段。
答案 1 :(得分:0)
您有几个选择: