【发布时间】:2011-12-08 18:17:15
【问题描述】:
我是 Objective C 的新手,我无法将 plist 中的值读取到一组 NSArray 中。我尝试引用 this question 但没有运气。
我有 3 个数组要加载到我的选择器中。我要加载的 3 个数组是数组转换、typesFrom 和 typesTo。 typesFrom 和 typesTo 包含相同的值,但会根据转换的类型而变化。
目前,选择器将加载 3 列但没有行。我觉得可能有一个简单的解决方案,但我已经尝试了几个小时,但似乎找不到它。
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
// Grab information from the plist
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle
pathForResource:@"conversions"
ofType:@"plist"
];
NSDictionary *dictionary = [[NSDictionary alloc]
initWithContentsOfFile:plistPath
];
// Store conversions
for(NSDictionary *dict in [dictionary valueForKey:@"Conversions"]) {
[self.conversions arrayByAddingObject:[dict valueForKey:@"name"]];
[self.categories arrayByAddingObject:[dict valueForKey:@"conversions"]];
}
[dictionary release];
[self loadIntoPicker:0];
}
- (void)loadIntoPicker:(NSInteger)index {
// Set the current category
NSArray *category = [self.categories objectAtIndex:index];
for (NSDictionary *conversion in category) {
[self.typesFrom arrayByAddingObject:[conversion valueForKey:@"type"]];
[self.typesTo arrayByAddingObject:[conversion valueForKey:@"type"]];
[self.descriptions arrayByAddingObject:[conversion valueForKey:@"description"]];
[self.multipliers arrayByAddingObject:[conversion valueForKey:@"multiplier"]];
}
[picker selectRow:0 inComponent:1 animated:YES];
[picker selectRow:0 inComponent:2 animated:YES];
[picker reloadComponent:1];
[picker reloadComponent:2];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 3;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
if ( component == kCategoryComponent )
return [self.conversions count];
else
return [self.typesFrom count];
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
if ( component == kCategoryComponent )
return [self.conversions objectAtIndex:row];
else if ( component == kConvertFromComponent )
return [self.typesFrom objectAtIndex:row];
else
return [self.typesTo objectAtIndex:row];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
if ( component == kCategoryComponent ) {
if ( row >= 0 )
[self loadIntoPicker:row];
}
}
我正在使用的 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">
<dict>
<key>Conversions</key>
<array>
<dict>
<key>name</key>
<string>Speed</string>
<key>conversions</key>
<array>
<dict>
<key>type</key>
<string>mph</string>
<key>description</key>
<string>mile/hour</string>
<key>multiplier</key>
<integer>1</integer>
</dict>
<dict>
<key>type</key>
<string>ft/s</string>
<key>description</key>
<string>foot/second</string>
<key>multiplier</key>
<real>1.466667</real>
</dict>
<dict>
<key>type</key>
<string>km/h</string>
<key>description</key>
<string>kilometer/hour</string>
<key>multiplier</key>
<real>1.609344</real>
</dict>
<dict>
<key>type</key>
<string>m/s</string>
<key>description</key>
<string>meter/second</string>
<key>multiplier</key>
<real>0.44704</real>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>Distance</string>
<key>conversions</key>
<array>
<dict>
<key>type</key>
<string>ft</string>
<key>description</key>
<string>feet</string>
<key>multiplier</key>
<integer>1</integer>
</dict>
<dict>
<key>type</key>
<string>yd</string>
<key>description</key>
<string>yard</string>
<key>multiplier</key>
<real>0.3333333</real>
</dict>
<dict>
<key>type</key>
<string>mi</string>
<key>description</key>
<string>mile</string>
<key>multiplier</key>
<real>0.0001894</real>
</dict>
<dict>
<key>type</key>
<string>in</string>
<key>description</key>
<string>inch</string>
<key>multiplier</key>
<integer>12</integer>
</dict>
<dict>
<key>type</key>
<string>m</string>
<key>description</key>
<string>meter</string>
<key>multiplier</key>
<real>0.3048</real>
</dict>
<dict>
<key>type</key>
<string>km</string>
<key>description</key>
<string>kilometer</string>
<key>multiplier</key>
<real>0.0003048</real>
</dict>
<dict>
<key>type</key>
<string>cm</string>
<key>description</key>
<string>centimeter</string>
<key>multiplier</key>
<real>30.48</real>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>Volume</string>
<key>conversions</key>
<array>
<dict>
<key>type</key>
<string>ft^3</string>
<key>description</key>
<string>cubic feet</string>
<key>multiplier</key>
<integer>1</integer>
</dict>
<dict>
<key>type</key>
<string>liter</string>
<key>description</key>
<string>liter</string>
<key>multiplier</key>
<real>28.31685</real>
</dict>
<dict>
<key>type</key>
<string>acre ft</string>
<key>description</key>
<string>acre foot</string>
<key>multiplier</key>
<real>2.3e-05</real>
</dict>
<dict>
<key>type</key>
<string>barrel</string>
<key>description</key>
<string>barrel [US, liquid]</string>
<key>multiplier</key>
<real>0.2374768</real>
</dict>
<dict>
<key>type</key>
<string>gallon</string>
<key>description</key>
<string>gallon [US, liquid]</string>
<key>multiplier</key>
<real>29.92208</real>
</dict>
<dict>
<key>type</key>
<string>quart</string>
<key>description</key>
<string>quart [US, liquid]</string>
<key>multiplier</key>
<real>29.92208</real>
</dict>
</array>
</dict>
</array>
</dict>
</plist>
【问题讨论】:
-
我认为您的阵列已关闭。请 NSLog 并发布结果。
-
你找到解决这个问题的方法了吗?
标签: iphone objective-c nsarray plist nsdictionary