Как создать 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);