当一个对象为零而另一个对象不是时,如何显示数据?

时间:2012-01-30 14:09:34

标签: ios objective-c object tableview addressbook

我有一个tableView,类似于Contacts。用户可以在其中添加联系人并获取显示的姓名和号码。当联系人只有名字而不是姓氏时,他会显示名字和(null)。为了避免它,我使用if语句。但由于某些原因,我总是在cell.textLabel.text = value;行发出SIGABRT错误。

以下是获取数据的代码:

- (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 个答案:

答案 0 :(得分:2)

SIGABRT表示抛出异常。在控制台日志中查找实际异常。我怀疑你实际上是在上一行中得到它:

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

最可能的错误是indexPath.row超过了menuArray


编辑:我想我看到了你的错误。它实际上可能是“不响应选择器”错误。在构建menuArray时,有时会添加Contacts,有时会添加NSString。 (Contacts是这个对象的一个​​非常奇怪的名字;它似乎是一个人。)你永远不会清除旧的menuArray,我怀疑当你改变lastName时你正在蜿蜒那里的陈旧信息随后会出现类型冲突。

另请注意,您正在泄露lastNamefirstName。您需要__bridge_transfer,而不是__bridge

答案 1 :(得分:2)

在同一个数组中混合对象类型非常狡猾。可能值得检查对象是否是您认为的对象,所以您要说:

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对象时,有时它可能是一个字符串。