我正在开发一款适用于iPhone的应用程序(我的第一个应用程序),我想使用两个UIPickerView来显示一些数据。第一个UIPickerView将显示汽车品牌列表(例如宝马,梅赛德斯,福特等......)第二个UIPickerView将显示模型,具体取决于您在第一个UIPickerView中选择的UIPickerViewItem。
我遇到的问题是没有设置UIPickerView,已经完成了。
我想知道如何从某种数据存储中填充PickerViews(可能是sqlite,核心数据......?不确定它们是如何工作的)而且,第二个PickerView应该只在第一次填充时填充一个人选择了一个项目,因此它只显示该品牌的模型。
我希望你理解,因为我真的没有得到如何做到这一点(我通常只进行网络开发,这非常容易使用PHP和MySQL ......);)
提前谢谢! 麦克
答案 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>
希望这有帮助。