ios - 通过索引获取 NSDictionary 键?

标签 ios objective-c ios7 nsdictionary uipickerview

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

我正在尝试使用字典作为选择器 View 的数据源,并希望通过以下委托(delegate)方法访问它:

- (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 个部分的选择器 View 的数据源:

第 0 部分 = myDict 键(第 1 项、第 2 项)

第 1 节 = 所选第 0 节行(子项 1、子项 2)的相应 myDict 值

最佳答案

因为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

从你的字典中创建这样的 MyPickerItem 对象的 NSArray,按照你希望它们出现在选择器 View 中的方式对它们进行排序(比如,按字母顺序 item1 ,然后通过 item2) 并使用 NSArray 作为选择器 View 的数据源:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    MyPickerItem *p = myArray[row];
    switch (component) {
        case 0: return p.item1;
        case 1: return p.item2;
    }
    return @"<-ERROR->";
}

关于ios - 通过索引获取 NSDictionary 键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23658209/

相关文章:

objective-c - NSTextField 像 safari 地址栏

ios - 如何在 AutoLayout 中设置 UIView 的框架?

iOS7无法隐藏tabbar、黑条

ios - 为通用类型返回 Nil

ios - 在Xcode中过滤警告类型

ios - 适用于 iOS 的 Google Analytics,未在 Google 端接收数据

ios - UITableView deselectRowAtIndexPath 淡化为白色而不是 contentView.backgroundColor?

ios - Cordova IOS webview 界面随机无响应

ios - 为什么数据给我空值?

mysql - 从未知时间戳转换为可读时间戳