2014-12-02 3 views
0

Я разрабатываю приложение, которое содержит значения в формате словаря и извлекает эти значения в массиве, как показано ниже: note: _detailedarray - изменяемый массив.iOS: добавляющий массив элементов из одной строки в другой массив

[_detailedarray addObject:[NSDictionary dictionaryWithObjectsAndKeys:_firstname ,  
    @"first_name" , _lastname , @"last_name" ,_phoneNumber,@"phone_Number" ,nil]]; 
    NSArray *ar=[[NSArray alloc]init]; 
    self.filtereditems=[NSMutableArray arrayWithCapacity:[_detailedarray count]]; 

    NSLog(@"array is,%@",ar); 
    CFRelease(phoneNumbers); 

} 
    [self.nametxt addTarget:self.autoCompleter action:@selector(textFieldValueChanged:) forControlEvents:UIControlEventEditingChanged]; 

_firstnamestring=[_detailedarray valueForKey:@"first_name"]; 

//_firstnamestring is a string and same _lastnamestring and _phnostring/// 

_lastnamestring=[_detailedarray valueForKey:@"last_name"]; 
_phonenostring=[_detailedarray valueForKey:@"phone_Number"]; 
_totalarray = [[NSMutableArray alloc] initWithObjects:_firstnamestring, 
_lastnamestring, _phonenostring, nil]; 

каждая строка содержит 6 значений, и моя проблема заключается в том, чтобы добавить элементы из этих массивов в один массив, который означает

_ firstnamestring contains 6 values and _phonenostring cointains 6 values and 
_lastnamestring contains 6 values how to append the first name,last name and phone 
    no strings at every object at index and keep in single array. 
+0

Его лучше иметь класс и массив, который будет содержать 6 значений. Ваша поисковая сортировка и т. Д. Будет работать, не теряя индекс. –

+0

@AnoopVaidya У него уже есть один массив с объектом для каждой записи (этот объект является словарем, а не обычным объектом, но это не огромная сделка). Вот что такое '_detailedArray'. Не поймите меня неправильно, я думаю, что пользовательские объекты имеют больше смысла, но если его вопрос был «как я могу получить один массив», то ответ «у вас уже был один, который называется' _detailedArray' ». Я не совсем понимаю этот вопрос. – Rob

+0

@Rob: если если правильно задать вопрос, он хочет сегрегацию 'firstName' и т. Д. ... тогда было бы легко получить их с помощью KVC ...' valueForKey: 'и каждый раз он будет в том же порядке, а затем он может хранить его в своих массивах. Ваш взгляд на это? –

ответ

0

Глядя на ваш образец кода, это выглядит, как у вас есть массив с именем _detailedArray, который представляет собой набор словарей, содержащих три ключа, first_name, last_name и phone_Number. Когда вы вызываете valueForKey с определенным ключом в массиве словарей, вы получаете массив значений для этого ключа. Это интересно, но не очень полезно здесь.

Есть несколько подходов, которые я мог бы предложить:

  1. Если вам действительно нужен этот массив «первый последний телефон» строк, вы должны построить что непосредственно:

    NSMutableArray *contactStrings = [NSMutableArray array]; 
    for (NSDictionary *contact in _detailedArray) { 
        [contactStrings addObject:[self stringForContact:contact]]; 
    } 
    

    Где stringForContact может быть определена следующим образом:

    - (NSString *)stringForContact:(NSDictionary *)contact 
    { 
        return [NSString stringWithFormat:@"%@ %@ %@", contact[@"first_name"], contact[@"last_name"], contact[@"phone_Number"]]; 
    } 
    

    Очевидно, что вы хотите расширить Тхи s для обработки всех видов сценариев (например, нет имени, фамилии и т. д.). Но это иллюстрирует общую идею.

  2. Должен признаться, что я не сумасшедший в отношении вышеупомянутого подхода к построению массива строк. Во-первых, вы занимаете вдвое больше памяти, не пользуясь преимуществами (например, вы можете показывать только 20 контактов за раз, но, возможно, вы создали весь этот массив для тысяч контактов без необходимости).

    Кроме того, у вас теперь есть два массива, которые вы должны синхронизировать, ваши contactStrings и ваш _detailedArray. Если, например, вы добавите функцию сортировки в какую-то будущую дату, и вы сортируете _detailedArray по фамилии, вы должны перестроить массив contactStrings (и вы, очевидно, не можете сортировать contactStrings сам, потому что у него нет значимых данных о том, что часть строки - это имя, а какая - фамилия и т. д.)

    Я лично предпочитаю придерживаться только _detailedArray. И тогда представление строкового представления контакта становится проблемой представления, а не дублирующей модельной структурой.

    Например, если показывающий _detailedArray контакты в виде таблицы, то cellForRowAtIndexPath может выглядеть следующим образом:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
        static NSString *cellIdentifier = @"Cell"; 
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    
        NSDictionary *contact = _detailedArray[indexPath.row]; 
        cell.textLabel.text = [self stringForContact:contact]; 
    
        return cell; 
    } 
    

    Таким образом, вместо того, чтобы строить другой массив строк, который в значительной степени дублирует _detailedArray, просто использовать _detailedArray себя.

Даже лучше, как это было предложено Anoop Вайдья, я мог бы посоветовать проектирование свой собственный пользовательский Contact класс, и заменить массив словарей с массивом пользовательских объектов.И тогда вы можете сделать метод stringForContact экземпляром этой модели Contact класса (там, где он, вероятно, принадлежит), скорее, кодируя его прямо в вашем контроллере вида.

Но, надеюсь, это иллюстрирует идею: модель должна захватить структуру базовых данных, и вы можете сделать строковое представление этого объекта отдельным методом, который вы вызываете по мере необходимости, вместо того, чтобы создавать дублирующий массив строк.

Смежные вопросы