Объекты tableView получают свойства других объектов - как обойти это? - PullRequest
0 голосов
/ 02 февраля 2012

Прежде всего объяснение: у меня есть обычный tableView с контактами и их номером в нем.Они могут добавить свои контакты там в приложение.Иногда у них есть фамилия, иногда нет.Дело в том, что когда я добавляю кого-то только с именем, фамилии других контактов тоже удаляются.И когда я добавляю кого-то с именем и фамилией, те, у кого есть только имя, получают (ноль), где должна быть фамилия.Я надеюсь, что я понял это (английский не мой родной язык) - я попробовал это с утверждениями if (как вы увидите в коде), но это не сработало.Я также попытался добавить те с firstName в другом массиве.Также не работает, потому что вы не можете (я думаю!) Заполнить tableView более чем одним массивом.

- (BOOL)peoplePickerNavigationController:

(ABPeoplePickerNavigationController *)peoplePicker

  shouldContinueAfterSelectingPerson:(ABRecordRef)person {

    firstName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
    lastName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);

   ABMultiValueRef phoneNumbers = (ABMultiValueRef)ABRecordCopyValue(person, kABPersonPhoneProperty);
    number = (__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneNumbers, 0);
    [thenumbers addObject:number];

    if(lastName && ([lastName length] > 0)) {  
    [menuArray addObject:[[Contacts alloc] initWithFirstName:firstName andLastName:lastName]];
    } 

    else {
    [menuArray addObject:[[Contacts alloc] initWithFirstName:firstName]];
    }

    [self dismissModalViewControllerAnimated:YES];
    return NO;
    }


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle  reuseIdentifier:CellIdentifier];}
if(lastName && ([lastName length] > 0)) { 
    Contacts *user = [menuArray objectAtIndex:indexPath.row];  
    NSString *cellValue = [NSString stringWithFormat:@"%@ %@", [user firstName], [user lastName]];
    cell.textLabel.text = cellValue;
    }
else { 
      Contacts *user = [menuArray objectAtIndex:indexPath.row];  
      NSString *cellValue = [NSString stringWithFormat:@"%@", [user firstName]];
      cell.textLabel.text = cellValue;
    }
    NSString *numbers = [thenumbers objectAtIndex:indexPath.row];
    cell.detailTextLabel.text = numbers;

return cell;
}

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

Ваш просмотр таблицы: cellforRowAtIndexPath: метод может вызываться несколько раз во время прокрутки (фактически он вызывается каждый раз при прокрутке новой строки в представлении или при перезагрузке данных табличного представления). Тем не менее, в этом методе вы работаете с переменной экземпляра lastName, которая была установлена ​​при добавлении человека. Это означает, что каждая строка в табличном представлении предполагает, что контакт, принадлежащий этой строке, имеет эту одну фамилию.

Вместо

if (lastName && ([lastName length] > 0)) { 
    Contacts *user = [menuArray objectAtIndex:indexPath.row];  
    NSString *cellValue = [NSString stringWithFormat:@"%@ %@", [user firstName], [user lastName]];
    cell.textLabel.text = cellValue;
} else { 
    Contacts *user = [menuArray objectAtIndex:indexPath.row];  
    NSString *cellValue = [NSString stringWithFormat:@"%@", [user firstName]];
    cell.textLabel.text = cellValue;
}

Вы захотите использовать

Contacts *user = [menuArray objectAtIndex:indexPath.row];  
if ([user lastName] && ([[user lastName] length] > 0)) { 
    NSString *cellValue = [NSString stringWithFormat:@"%@ %@", [user firstName], [user lastName]];
    cell.textLabel.text = cellValue;
} else { 
    NSString *cellValue = [NSString stringWithFormat:@"%@", [user firstName]];
    cell.textLabel.text = cellValue;
}
1 голос
/ 02 февраля 2012

В вашем сценарии лучше использовать ABRecordCopyCompositeName, которое возвращает:

Возвращает подходящее удобное для человека имя для записи.Для записей персонала: объединенное значение этих свойств: Префикс, Суффикс, Организация, Имя и Фамилия.

Посмотрите здесь - ABRecordCopyCompositeName в ссылке ABRecord

...