扩展和撤消iPhone应用程序中的下拉列表

时间:2011-03-24 02:03:52

标签: iphone drop-down-menu uipickerview

我开始开发iPhone应用程序。我需要提供一个下拉框,供客户选择一个值,该值在提交时将基本上下行发送到数据库。我显然使用UIPickerView作为从IB构建的下拉列表。

加载视图后,系统会启用下拉列表,并显示所有值。

问题是:

  1. 点击后,我只能展开下拉列表吗?
  2. 用户选择值后,我可以撤消列表吗?
  3. 我认为在下拉方面非常以网络为中心,但我可能会把这一切都弄错。

2 个答案:

答案 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)

您有几个选择:

  1. 对于初学者来说可能最简单:推送一个新视图(作为模态视图或导航堆栈),将列表显示为表格视图,用于单击所需的项目或作为其滚动的pickerView。 / LI>
  2. 查看Twitter应用“我的个人资料”视图。虽然我没有亲自完成此操作,但我认为它只是使用didSelectRowAtIndex来确定用户单击哪个部分,然后在调用[tableView reloadData]之前填充该部分的值数组