【问题标题】:pulling a value from NSMutableDictionary从 NSMutableDictionary 中提取一个值
【发布时间】:2013-10-21 11:22:51
【问题描述】:

这是我为字典中的相同键返回唯一值的代码。现在,在我的日志中,我的“对象数组:”是 6(3 组(2 个具有相同键的对象)),而我的“字典:”从每组返回 1 个对象的值(3 个唯一值)。在我的“for”声明中:

for (id key in dict)
{
       self.titlesArray = [NSMutableArray arrayWithObject:dict];
       NSLog(@"titles: %@", self.titlesArray);
       self.titlesArray = [[NSMutableArray alloc] initWithObjects:[dict valueForKey:key] ,nil];
       NSLog(@"titles: %@", self.titlesArray);

}

第一个日志打印出三个唯一值和键。第二个只打印单个键的单个值(这是我想要的......但我需要所有三个键值)所以我现在的问题是我无法从字典中为每个唯一值提取一个键并添加它到我的titlesArray。

for (id key in dict) 
{
    self.titlesArray = [NSMutableArray arrayWithObject:dict];
    self.titlesArray = [[NSMutableArray alloc] initWithObjects:[dict valueForKey:key] ,nil];

代码不太正确。

    PFQuery *query = [PFQuery queryWithClassName:@"Images"];
    [query whereKey:@"recipientIds" equalTo:[[PFUser currentUser] objectId]];
    [query orderByDescending:@"createdAt"];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (error) {
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }
        else {

            // found messages!
            self.objectsArray = objects;

            NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
            for(id obj in self.objectsArray){
                PFObject *key = [obj valueForKey:@"titleLabel"];

                if(![dict objectForKey:key]){
                    [dict setValue:key forKey:[obj valueForKey:@"titleLabel"]];
                }
            }
            for (id key in dict) {
                self.titlesArray = [NSMutableArray arrayWithObject:dict];
NSLog(@"titles: %@", self.titlesArray);
                self.titlesArray = [[NSMutableArray alloc] initWithObjects:[dict valueForKey:key] ,nil];
NSLog(@"titles: %@", self.titlesArray);
            } 
            NSLog(@"dictionary: %@", dict);
            NSLog(@"Objects array is %d", [self.objectsArray count]);

            [self.pickerView reloadComponent:0];

【问题讨论】:

    标签: ios nsmutabledictionary key-value


    【解决方案1】:

    看起来有一些类型错误

    PFObject *key = [self.objectsArray valueForKey:@"titleLabel"];
    

    应该是

     PFObject *key = [obj valueForKey:@"titleLabel"];
    

    【讨论】:

    • 我认为他正试图将他从这个调用 [self.objectsArray valueForKey:@"titleLabel"] 得到的任何东西作为字典中对象的键传递。
    【解决方案2】:

    这行发生了,不是吗:

     if(![dict objectForKey:@"titleLabel"]){
                [dict setValue:obj forKey:key];
            }
        }
    

    您将“obj”设置为一个值,那里没有问题,但是您使用的是 PFObject 的“key”,但是 NSDictionary 需要一个 NSString 作为键。

    如果 PFObject 包含一个你想使用的 NSString 属性,你可以把它传入。例如,如果 PFObject 有一个名为“name”的 NSString 属性,你可以这样称呼:

    if(![dict objectForKey:@"titleLabel"]) {
               [dict setValue:obj forKey:key.name];
            }
        }
    

    需要注意的是NSMutableDictionary定义该方法时的参数类型,即(NSString*):

     - (void)setValue:(id)value forKey:(NSString *)key
    

    【讨论】:

    • 我更新了我的问题以显示 PFObject 和键的定义。就访问字符串属性而言,您所说的对我来说很有意义,尽管我尝试使用点表示法来访问它,但错误提示找不到属性。它被作为字符串保存到后端(解析),因为我已经检查过..所以我不明白为什么我不能这样访问它。
    • 如果 PFObject 是 NSMutableDictionary 的子类,那么您需要执行完整的 [image objectForKey:somekey],假设返回的对象是 NSString,那么您可以将该字符串作为键传递在您的 [dict setValue:obj forKey:] 语句中。点访问器符号适用于对象的属性,而不是字典的键/对象对。
    • 明白了。好吧,我一直在努力,并取得了一些进展。我更新了我的原始问题和代码以反映我当前的状态。我现在能够为一个键获取一个唯一值,但仍然无法为我的字典中的每个键获取一个唯一值。
    【解决方案3】:

    你的 PFObject 是什么样子的。它里面有字符串吗?根据您的问题,您已经知道不能将 PFObject 作为字典的键传递。如果你的对象是这样的

    interface PFObject : NSObject
    
    {
        NSString *keyString;
        ......
        .Some other variables
    }
    

    那么你应该像这样使用它来设置它作为键

    PFObject *key = [self.objectsArray valueForKey:@"titleLabel"];
    
                if(![dict objectForKey:@"titleLabel"]){
                    [dict setValue:obj forKey:[key valueForKey@"titleLabel"]];
                }
    

    【讨论】:

    • 我更新了我的问题以显示 PFObject 定义。我尝试使用点符号来访问该属性,但它会引发未找到属性的错误。 Parse 将密钥存储为字符串,所以我不明白为什么我不能这样访问它
    • 谢谢!它没有解决问题,但帮助我以不同的方式看待它,让我能够更深入地了解它。不过还是卡住了。
    • 好的,您能否更新您的问题以显示您遇到的问题。
    • 我实际上刚刚得到它,虽然我仍然需要分析它以确定到底发生了什么。但是我发布的代码只返回给定键的唯一值。感谢您的帮助!
    【解决方案4】:

    这是我发现可以工作的代码。它采用数组并对键进行排序以仅返回特定键的唯一值:

    PFQuery *query = [PFQuery queryWithClassName:@"Images"];
        [query whereKey:@"recipientIds" equalTo:[[PFUser currentUser] objectId]];
        [query orderByDescending:@"createdAt"];
        [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
            if (error) {
                NSLog(@"Error: %@ %@", error, [error userInfo]);
            }
            else {
                // found messages!
                self.objectsArray = objects;
    
                NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
                for(id obj in self.objectsArray){
                    PFObject *key = [obj valueForKey:@"titleLabel"];
    
                    if(![dict objectForKey:key]){
                        [dict setValue:key forKey:[obj valueForKey:@"titleLabel"]];
                    }
                }
                for (id key in dict) {
                    self.titlesArray = [NSMutableArray arrayWithObject:dict];
                    [self.titlesArray addObject:dict.allKeys];
                    self.titlesArray = [self.titlesArray objectAtIndex:1];
                }
                NSLog(@"titles: %@", self.titlesArray);
    
                [self.pickerView reloadComponent:0];
    

    【讨论】:

    • 很高兴你明白了,我终于意识到 PFObject 不是你写的类,而是一个在线文档库。如果我早点意识到这一点,我可能会为你制作更多有用的 cmets...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2012-11-07
    相关资源
    最近更新 更多