在iPhone应用程序中展开和收回下拉列表

在iPhone应用程序中展开和收回下拉列表,iphone,drop-down-menu,uipickerview,Iphone,Drop Down Menu,Uipickerview,我正在着手开发一款iPhone应用程序。我需要提供一个下拉框,供客户选择一个值,该值在提交时基本上会发送到下游数据库。很明显,我使用了一个UIPickerView作为下拉列表,它是从IB构建的 加载“我的视图”后,将启用下拉列表,并显示所有值 问题是: 我只能在单击下拉列表后将其展开吗 一旦用户选择一个值,我可以收回列表吗 我认为下拉列表非常以网络为中心,但我可能完全错了。您有几个选择: 对于初学者来说,可能最简单的方法是:推送一个新视图(作为模式视图或导航堆栈),该视图将列表显示为单击所需项目

我正在着手开发一款iPhone应用程序。我需要提供一个下拉框,供客户选择一个值,该值在提交时基本上会发送到下游数据库。很明显,我使用了一个
UIPickerView
作为下拉列表,它是从IB构建的

加载“我的视图”后,将启用下拉列表,并显示所有值

问题是:

  • 我只能在单击下拉列表后将其展开吗
  • 一旦用户选择一个值,我可以收回列表吗

  • 我认为下拉列表非常以网络为中心,但我可能完全错了。

    您有几个选择:

  • 对于初学者来说,可能最简单的方法是:推送一个新视图(作为模式视图或导航堆栈),该视图将列表显示为单击所需项目的表格视图或滚动列表的pickerView
  • 查看twitter应用程序“我的个人资料”视图。虽然我个人没有这样做,但我认为这只是使用DidSelectRowatinex来确定用户单击了哪个部分,然后在调用[tableView reloadData]之前为该部分填充一个值数组

  • 视图控制器需要实现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字段,并且输入该字段会显示带有选择器视图的视图。完成后,请确保也移动到下一个字段