1

这是我为字典中的相同键返回唯一值的代码。现在,在我的日志中,我的“对象数组:”是 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];
4

4 回答 4

1

看起来有一些类型错误

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

它应该是

 PFObject *key = [obj valueForKey:@"titleLabel"];
于 2013-10-19T03:08:37.307 回答
1

你的 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"]];
            }
于 2013-10-19T03:12:48.527 回答
1

它发生在这一行,不是吗:

 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
于 2013-10-19T03:21:05.373 回答
0

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

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];
于 2013-10-21T03:22:51.610 回答