Как отобразить данные, когда один объект равен нулю, а другой нет? - PullRequest
1 голос
/ 30 января 2012

У меня есть tableView, похожий на Контакты. Пользователь может добавить в него свои контакты и получить имена и отображаемый номер. Когда у контакта есть только имя, а не фамилия, он отображает имя и (ноль). Чтобы избежать этого, я использую оператор if. Но по какой-то причине я всегда получаю ошибку SIGABRT в строке cell.textLabel.text = value;.

Вот код для получения данных:

- (BOOL)peoplePickerNavigationController:

(ABPeoplePickerNavigationController *)peoplePicker

  shouldContinueAfterSelectingPerson:(ABRecordRef)person {

    firstName = (__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
    lastName = (__bridge 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: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 { 
    NSString *value = [menuArray objectAtIndex:indexPath.row]; 
    cell.textLabel.text = value;

}

NSString *numbers = [thenumbers objectAtIndex:indexPath.row];
cell.detailTextLabel.text = numbers;

return cell;
}

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Это довольно хитрое смешение типов объектов в одном массиве. Вероятно, стоит проверить, являются ли объекты такими, какими вы их считаете, поэтому вы говорите:

Contacts *user = [menuArray objectAtIndex:indexPath.row];  
NSString *cellValue = [NSString stringWithFormat:@"%@ %@", [user firstName], [user lastName]]; 

Попробуйте сказать:

Contacts *user = [menuArray objectAtIndex:indexPath.row]; 
if ([user isKindOfClass:[Contacts class]])
{
    NSLog(@"Okay, it's fine");
}
else
{
    NSLog(@"Oops, I messed up");
}

Я догадываюсь, что, возможно, иногда это строка, когда вы ожидаете, что это будет объект Contacts.

2 голосов
/ 30 января 2012

SIGABRT означает исключение. Посмотрите в журнале консоли фактическое исключение. Я подозреваю, что вы на самом деле получаете это в предыдущей строке:

    NSString *value = [menuArray objectAtIndex:indexPath.row]; 

Наиболее вероятной ошибкой является то, что indexPath.row прошел конец menuArray.


РЕДАКТИРОВАТЬ : Я думаю, что вижу вашу ошибку. На самом деле это, вероятно, ошибка «не отвечает селектору». Когда вы строите menuArray, иногда вы добавляете Contacts, а иногда вы добавляете NSString. (Contacts - очень странное имя этого объекта; кажется, что это один человек.) Вы никогда не очищаете старый menuArray, и я подозреваю, что когда вы меняете lastName, вы попадаете с устаревшей информацией. затем возникает конфликт типов.

Также обратите внимание, что вы пропускаете lastName и firstName. Вам нужно __bridge_transfer здесь, а не __bridge.

...