我有一个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;
}
答案 0 :(得分:2)
SIGABRT表示抛出异常。在控制台日志中查找实际异常。我怀疑你实际上是在上一行中得到它:
NSString *value = [menuArray objectAtIndex:indexPath.row];
最可能的错误是indexPath.row
超过了menuArray
。
编辑:我想我看到了你的错误。它实际上可能是“不响应选择器”错误。在构建menuArray
时,有时会添加Contacts
,有时会添加NSString
。 (Contacts
是这个对象的一个非常奇怪的名字;它似乎是一个人。)你永远不会清除旧的menuArray
,我怀疑当你改变lastName
时你正在蜿蜒那里的陈旧信息随后会出现类型冲突。
另请注意,您正在泄露lastName
和firstName
。您需要__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对象时,有时它可能是一个字符串。