通过索引获取NSDictionary键?

时间:2014-05-14 14:54:38

标签: ios objective-c ios7 nsdictionary uipickerview

是否可以通过索引获取字典键?

我试图使用字典作为选择器视图的数据源,并希望通过以下委托方法访问它:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
if (component == 0){
   return  [NSString stringWithFormat:@"%@",[myDict // how to get the key]];
}

编辑 -

myDict类似于:

第1项

  • 子项目1
  • 子项目2

第2项

  • 子项目1
  • 子项目2

我想使用myDict作为包含2个部分的选择器视图的数据源:

第0节= myDict键(第1项,第2项)

第1部分=所选第0行(子项目1,子项目2)的相应myDict值

4 个答案:

答案 0 :(得分:21)

由于NSDictionary无序关联容器,因此它没有索引的概念。它的密钥是任意排序的,并且该顺序将来可能会改变。

您可以从字典中获取NSArray个密钥,并对其应用索引:

NSArray *keys = [myDict allKeys]; // Warning: this order may change.

但是,只要字典保持不变,此索引方案就会保持一致:例如,如果使用NSMutableDictionary,则添加额外的键可能会更改现有键的顺序。这导致了极难调试的问题。

更好的方法是将拣货员的物品放入有序的容器中,例如NSArray。为选择器项创建一个特殊类,例如

@interface MyPickerItem : NSObject
@property (readwrite, nonatomic) NSString *item1;
@property (readwrite, nonatomic) NSString *item2;
@end

从您的词典中创建NSArray个此类MyPickerItem个对象,按照您希望它们在选择器视图中显示的方式排序(例如,按item1按字母顺序排列,然后按{{ 1}})并使用item2作为选择器视图的数据源:

NSArray

答案 1 :(得分:4)

这将为您提供随机排序的密钥

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row    forComponent:(NSInteger)component{
    if (component == 0){
        return  [NSString stringWithFormat:@"%@",[myDict allKeys][row]];
    }
}

答案 2 :(得分:1)

不,因为字典没有订单。

除了字典之外,您还需要提供一系列密钥,这些密钥会为您提供订单。

@interface MyClass ()
@property NSMutableArray *keysArray;     // Don't forget to allocate this in an init method
@end

- (NSString *)pickerView:(UIPickerView *)pickerView
             titleForRow:(NSInteger)row
            forComponent:(NSInteger)component
{
    if (component == 0){
        NSString *key = self.keysArray[row];
        return self.myDict[key];    // I assume you just want to return the value
    }
    ...

答案 3 :(得分:1)

NSDictionary是一种无序的数据结构,这意味着使用索引进行访问没有多大意义。您可能需要NSArray。但是,如果您的词典使用NSNumbers作为键,那么您可以像这样访问它。

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    if (component == 0) {
       return  [NSString stringWithFormat:@"%@", myDict[@(row)]];
    }
}