将数据加载到UIPIckerView?

时间:2014-07-15 10:10:56

标签: ios delegates datasource uipickerview

我正在尝试构建一个与PDF's数据库一起工作的应用。我需要的是让应用程序查看存储的所有文件(PDF)并将某些文件拉出来,对数据库进行检查,然后显示UIPicker上可用的PDF列表

我的第一步是应用程序检查文件并创建一个选择器轮,该选择器轮已填充目录中有数据的国家/地区。

为了完成这项工作,我已经为文件名创建了一个标准格式:'Country-Airfield-Plate Name-Date.pdf',例如: “UK-London Heathrow-ILS DME NDB 27-100214.pdf”。我首先将这个文件名首先拆分为两个字符串:'UK-London Heathrow-ILS DME NDB 27'和'pdf',然后我们将连字符分割为'英国','伦敦希思罗机场'和'ILS DME NDB 27'。

应用程序将检查国家信息的第一个字符串,然后检查机场的第二个字符串,然后显示适当机场的第三个字符串列表。

我如何首先从数据库中获取特定字段的数据,例如。国家/地区制作一个NSArray表单数据并将NSArray加载到UIPickerView,然后在UIPickerView DelegateDatasource方法中使用该数组?< / p>

1 个答案:

答案 0 :(得分:2)

如果您没有任何网络服务,并且您自己正在处理这些文件。您可以对.plist文件进行硬编码并将其放在您的网站上,每次打开应用程序时下载这个小的plist文件,加密并保存到您的文档目录。

plist基本上是一个带有对象和键的NSDictionary。 所以你的plist结构看起来像这样:

{
    Countries =     (
                {
            Airfields =             (
                                {
                    Code = JNB;
                    Plates =                     (
                                                {
                            Title = "Plate 1";
                            URL = "http://www.airport.com/za/airfield/plate1/document.pdf";
                        }
                    );
                    Title = "OR Tambo";
                }
            );
            Title = "South Africa";
        }
    );
}

上面的例子在你的情况下只包含每个数组中的1个对象,它会更多。

然后使用以下UIPickerView委托,假设调用了button.tag来更改pickerview.tag并为pickerview显示正确的数组:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
{
    return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
{
    return [[self returnCorrectArrayForButton:pickerView.tag] count];
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    return [[[self returnCorrectArrayForButton:pickerView.tag] objectAtIndex:row] valueForKey:@"Title"];
}

// Handle these errors where user can click on any button. Airfields will be empty if no country selected. Plates will be empty when no Airfields selected. After loading all arrays, pressing random buttons might give wrong information.

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    if (pickerView.tag == 1) {

        _airfieldArray = [[_countryArray objectAtIndex:row] objectForKey:@"Airfields"];
        [_countryButton setTitle:[[_countryArray objectAtIndex:row] valueForKey:@"Title"] forState:UIControlStateNormal];

    } else if (pickerView.tag == 2) {

        _plateArray = [[_airfieldArray objectAtIndex:row] objectForKey:@"Plates"];
        [_airfieldButton setTitle:[[_airfieldArray objectAtIndex:row] valueForKey:@"Title"] forState:UIControlStateNormal];

    } else if (pickerView.tag == 3) {

        // Show PDF in webview for selected plate
        [_plateButton setTitle:[[_plateArray objectAtIndex:row] valueForKey:@"Title"] forState:UIControlStateNormal];
        NSString *urlString = [[_plateArray objectAtIndex:row] valueForKey:@"URL"];
        NSLog(@"Selected Plate PDF URL : %@", urlString);
    }
}

- (NSArray *)returnCorrectArrayForButton:(NSUInteger)buttonIndex
{
    if (buttonIndex == 1) {
        // Return Countries array
        return _countryArray;

    } else if (buttonIndex == 2) {
        // Return Airfield array
        return _airfieldArray;

    } else if (buttonIndex == 3) {
        // Return Plates array
        return _plateArray;
    }
    return nil;
}