Как создать NSMutableDictionary с несколькими типами для контактов в адресной книге?

Это функция, которую я использую, чтобы получить имя контакта и адрес электронной почты из адресной книги.

-(void) fetchFriendsAllDetails {

    NSMutableArray *allEmails = [[NSMutableArray alloc] initWithCapacity:_peopleList.count];
    for (int i = 0; i < _peopleList.count; i++) {
        ABRecordRef person = (__bridge ABRecordRef)([_peopleList objectAtIndex:i]);
        ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
        NSString *name=[[NSString stringWithFormat:@"%@",(__bridge_transfer NSString *)ABRecordCopyCompositeName(person)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

        NSLog(@"id:%d,name:%@",i,name);

        for (int j=0; j < ABMultiValueGetCount(emails); j++) {
            NSString* email = (__bridge NSString*)ABMultiValueCopyValueAtIndex(emails, j);
            [allEmails addObject:email];
            NSLog(@"id:%d,email:%@",i,email);
        }
    }
}

Вывод вышеизложенного выглядит следующим образом:

id:0,name:John Appleseed
id:0,email:John-Appleseed@mac.com

id:1,name:Kate Bell
id:1,email:kate-bell@mac.com
id:1,email:www.icloud.com

id:2,name:Anna Haro
id:2,email:anna-haro@mac.com

id:3,name:Daniel Higgins Jr.
id:3,email:d-higgins@mac.com

id:4,name:David Taylor

id:5,name:Hank M. Zakroff
id:5,email:hank-zakroff@mac.com

Я хочу сделать словарь в вышеупомянутой функции, которая будет содержать вывод в следующем формате

 {
id:0
name:John Appleseed
email:John-Appleseed@mac.com
selectedFlag:NO
},
{
id:1
name:Kate Bell
email:kate-bell@mac.com, www.icloud.com
selectedFlag:NO
},
{
id:2
name:Anna Haro
email:John-Appleseed@mac.com
selectedFlag:NO
},
{
id:3
name:Daniel Higgins Jr.
email:d-higgins@mac.com
selectedFlag:NO
},
{
id:4
name:David Taylor
email:""
selectedFlag:NO
},
id:5
nameHank M. Zakroff
email:hank-zakroff@mac.com
selectedFlag:NO
}

У меня есть базовое понимание NSMutableDictionary, но я не знаю в деталях, чтобы реализовать это. Вы можете помочь мне создать это?

5 ответов

Решение

Похоже, вы хотите массив словарей.

-(void) fetchFriendsAllDetails
{
    NSMutableArray *allContacts = [[NSMutableArray alloc] initWithCapacity:_peopleList.count];
    for (NSUInteger i = 0; i < _peopleList.count; i++)
    {
        ABRecordRef person = (__bridge ABRecordRef)([_peopleList objectAtIndex:i]);
        ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
        NSString *name=[[NSString stringWithFormat:@"%@",(__bridge_transfer NSString *)ABRecordCopyCompositeName(person)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

        NSLog(@"id:%d,name:%@",i,name);

        NSUInteger count = ABMultiValueGetCount(emails);
        NSMutableArray *emailsM = [[NSMutableArray alloc] initWithCapacity:count];
        for (NSUInteger j=0; j < ABMultiValueGetCount(emails); j++)
        {
            NSString* email = (__bridge NSString*)ABMultiValueCopyValueAtIndex(emails, j);
            [emailsM addObject:email];
//            NSLog(@"id:%d,email:%@",i,email);
        }
        [allContacts addObject:@{@"id": @(i),
                                 @"name": name,
                                 @"email": [NSArray arrayWithArray:emailsM],
                                 @"selectedFlag": @(NO)}];
    }
}

Используйте NSMutableDictionary's setObject:forKey: метод.

- (void)setObject:(id)anObject forKey:(id < NSCopying >)aKey

Из официальной документации этот метод:

Добавляет данную пару ключ-значение в словарь.

Например, мы можем изменить ваш код для создания необходимого массива словарей. Мы создаем NSMutabeDictionary объект для каждого индекса цикла for и продолжайте добавлять его в NSMutableArray объект.

-(void) fetchFriendsAllDetails
{
    // allocate array
    NSMutableArray *array = [[NSMutableArray alloc]init];  
    NSMutableArray *allEmails = [[NSMutableArray alloc] initWithCapacity:_peopleList.count];
    NSMutableDictionary *dictionary;
    for (int i = 0; i < _peopleList.count; i++)
    {
    dictionary  = [[NSMutableDictionary alloc]init];
    ABRecordRef person = (__bridge ABRecordRef)([_peopleList objectAtIndex:i]);
    ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
    NSString *name=[[NSString stringWithFormat:@"%@",(__bridge_transfer NSString *)ABRecordCopyCompositeName(person)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    // create key -vale pair for id and name
   [dictionary setObject:[NSNumber numberWithInt:i] forKey:@"id"]; // here we used int wrapped inside and //object because  NSMutable Dictionary expects an object instead of scalar type int.
   [dictionary setObject:name forKey:@"name"];
    NSLog(@"id:%d,name:%@",i,name);

  // Create an NSMutableString to hold more than one email
    NSMutableString *mutableEmail = [[NSMutableString alloc]init];
      for (int j=0; j < ABMultiValueGetCount(emails); j++)
        {
            NSString* email = (__bridge NSString*)ABMultiValueCopyValueAtIndex(emails, j);
            [mutableEmail appendString:email];
            // append comma to separate more than one mail   
            if(j != ABMultiValueGetCount(emails) - 1)
             {
               [mutableEmail appendString:@","];
             } 
            [allEmails addObject:email];
            NSLog(@"id:%d,email:%@",i,email);
        }
      [dictionary setObject:mutableEmail forKey:@"email"];
      // for boolean also. wrap inside an object
      [dictionary setObject:[NSNumber numberWithBool:NO] forKey:@"id"];
      // add dictionary to array
      [array addObject:dictionary];
    }
}

PS: я пишу это в Windows, так что прошу прощения за любые опечатки.

Сделал для вашей первой части. Пожалуйста, попробуй:-

    NSDictionary *countriesListedByLetter = @{@"id" : @"0", @"name" : @"John Appleseed", @"email" : @"John-Appleseed@mac.com", @"selectedFlag": @"NO"};
        NSLog(@"%@",countriesListedByLetter);

OUtPUt:--
{
    email = "John-Appleseed@mac.com";
    id = 0;
    name = "John Appleseed";
    selectedFlag = NO;
}

Попробуй это:

-(void) fetchFriendsAllDetails
{

    NSMutableArray *allEmails = [[NSMutableArray alloc] initWithCapacity:_peopleList.count];
    for (int i = 0; i < _peopleList.count; i++)
    {
        NSMutableDictionary *addressesDict = [[NSMutableDictionary alloc] initWithCapacity:4];
        ABRecordRef person = (__bridge ABRecordRef)([_peopleList objectAtIndex:i]);
        ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
        NSString *name=[[NSString stringWithFormat:@"%@",(__bridge_transfer NSString *)ABRecordCopyCompositeName(person)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

        NSLog(@"id:%d,name:%@",i,name);

        [addressesDict setValue:[NSString stringWithFormat:@"%i",i] forKey:@"id"];
        [addressesDict setValue:name forKey:@"name"];


       for (int j=0; j < ABMultiValueGetCount(emails); j++)
         {
             NSMutableString *emailString = [[NSMutableString alloc]init];
             NSString* email = (__bridge NSString*)ABMultiValueCopyValueAtIndex(emails, j);
            [emailString appendString:email];

           if(j != ABMultiValueGetCount(emails) - 1)
           {
           [emailString appendString:@","];
           } 
          [allEmails addObject:emailString];
          [emailString release];

        }

        [addressesDict setValue:@"NO" forKey:@"selectedFlag"];
        [allEmails addObject:addressesDict];

    }

    NSLog(@"RESULT: %@",allEmails);

}

Попробуйте заглянуть в массив словарей.

NSMutableArray *allEmails = [[NSMutableArray alloc] initWithCapacity:_peopleList.count];
    for (int i = 0; i < _peopleList.count; i++)
    {
        NSMutableDictionary *dict = [[NSMutableDictionary alloc] init] ;  
        ABRecordRef person = (__bridge ABRecordRef)([_peopleList objectAtIndex:i]);
        ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
        NSString *name=[[NSString stringWithFormat:@"%@",(__bridge_transfer NSString *)ABRecordCopyCompositeName(person)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

        NSLog(@"id:%d,name:%@",i,name);
        [dict setObject:[NSNumber numberWithInt:i] forKey:@"id"];
        [dict setObject:[NSNumber numberWithBool:false] forKey:@"seletedFlag"];
        [dict setObject:name forKey:@"name"];
        for (int j=0; j < ABMultiValueGetCount(emails); j++)
        {
            NSString* email = (__bridge NSString*)ABMultiValueCopyValueAtIndex(emails, j);
               [dict setObject:email forKey:@"email"];
            NSLog(@"id:%d,email:%@",i,email);
        }
        [allEmails addObject:dict];
        [dict release];

    }


}

  NSLog(@"%@",allEmails);
Другие вопросы по тегам