根据数据显示数据UIPickerView

时间:2012-08-09 15:30:28

标签: iphone objective-c xcode ios5 core-data

我正在开发一款适用于iPhone的应用程序(我的第一个应用程序),我想使用两个UIPickerView来显示一些数据。第一个UIPickerView将显示汽车品牌列表(例如宝马,梅赛德斯,福特等......)第二个UIPickerView将显示模型,具体取决于您在第一个UIPickerView中选择的UIPickerViewItem。

我遇到的问题是没有设置UIPickerView,已经完成了。

我想知道如何从某种数据存储中填充PickerViews(可能是sqlite,核心数据......?不确定它们是如何工作的)而且,第二个PickerView应该只在第一次填充时填充一个人选择了一个项目,因此它只显示该品牌的模型。

我希望你理解,因为我真的没有得到如何做到这一点(我通常只进行网络开发,这非常容易使用PHP和MySQL ......);)

提前谢谢! 麦克

2 个答案:

答案 0 :(得分:1)

这取决于您的要求所需的数据源类型。如果您的数据源是静态的,并且它永远不会改变,那么您想要的只是一个简单的NSArray,您可以在每次启动应用程序时创建它。根据您的要求,看起来这绝对是您想要做的事情,因为这是更简单的方法。

每当你创建你的UIPickerController或者它是IBOUTLET时,都要对ivar / property执行此操作:

myPicker1.tag = 1;
myPicker2.tag = 2;

分配标记以区分它们,因为它们将在委托/数据源上调用相同的回调方法(在本例中为ViewController)

然后,由于你想根据Picker 1上的值选择对Picker 2采取行动,你需要这样的东西:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{

    if (pickerView.tag == 1) {
         //Means a value just changed on your picker 1!, update datasource for your second picker
        [myPicker2 reloadComponent:0]; // This will trigger the method - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component method below
    }

}

最后实现下面的- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component方法,当选择器需要加载其组件时调用该方法,或者在这种情况下也调用reloadComponent

你需要这样的东西:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
     if (pickerView.tag == 2) {
      //Get appropriate value from the array and return the string for that row
            MyObject *selectedObject = [myArray objectAtIndex:[pickerActivity selectedRowInComponent:0]];
            //Return what you need depending on your needs.
       }
}

最后,我建议您查看UIPickerView class reference

希望有所帮助。

答案 1 :(得分:1)

核心数据是要走的路,但学习曲线陡峭。你应该花一些时间来学习它。

更容易,也许足以满足您的目的是与plist合作。这些是Apple特定的xml文件,结构简单。您可以直接在Xcode中编辑它们,格式非常透明。

然后你可以从plist一次加载所有数据,并根据第一个选择填充第二个选择器。

或者您可以使用JSON文件。这些甚至更简单,作为一名网络程序员,你可能对它们很熟悉。

一些提示:

您的数据应该具有以下结构:字典数组;每个字典都有一个品牌的钥匙和一个另一个阵列,一个模型列表。这个子数组是一个带有名称键的字典(如果你的应用程序需要它,可能会更多)。

您可以像这样加载名为“Data.plist”的plist文件(JSON是模拟的):

NSString *path = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
NSArray *data = [NSArray arrayWithContentsOfFile:path];

现在您可以获得这样的品牌列表(假设您的品牌名称是“名称”):

NSArray *brands = [data valueForKeyPath:@"name"]; 

一个品牌品牌列表:

NSArray *models = [[[data filteredArrayUsingPredicate:[NSPredicate
   predicateWithFormat:@"name = %@", @"Ford"]] objectAtIndex:0] 
    valueForKey:@"models"]);

要对选择的第一个选择器视图作出反应,请确保您的视图控制器是选择器视图的委托并覆盖pickerView:didSelectRow:inComponent:

您可以通过分配tags并在回调方法中检查它们来区分这些委托方法中的选择器。

以下是您的plist结构示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>name</key>
        <string>Ford</string>
        <key>models</key>
        <array>
            <string>Mustang</string>
            <string>Capri</string>
        </array>
    </dict>
    <dict>
        <key>name</key>
        <string>VW</string>
        <key>models</key>
        <array>
            <string>Polo</string>
            <string>Golf</string>
        </array>
    </dict>
</array>
</plist>

希望这有帮助。