2014-01-13 5 views
0

Я использую это в своем viewWillAppear:, чтобы напечатать все имена и номера моих контактов на моей консоли.Печать адресной книги на консоль с NSLog

- (void)viewWillAppear:(BOOL)animated 
{ 
    CFErrorRef error = nil; 
    // Request authorization to Address Book 
    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, &error); 

    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { 
     ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) 
     { 
      if (granted) { 
       // First time access has been granted, add all the user's contacts to array. 

       contactsObjects = (__bridge NSMutableArray *)(ABAddressBookCopyArrayOfAllPeople(addressBookRef)); 
      } else { 
       // User denied access. 
       // Display an alert telling user that they must allow access to proceed to the "invites" page. 
      } 
     }); 
    } 
    else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { 
     // The user has previously given access, add all the user's contacts to array. 

     contactsObjects = (__bridge NSMutableArray *)(ABAddressBookCopyArrayOfAllPeople(addressBookRef)); 
    } 
    else { 
     // The user has previously denied access 
     // Send an alert telling user that they must allow access to proceed to the "invites" page. 
    } 

    NSLog(@"%@", contactsObjects); 
} 

и вот выход

С этим сообщением об ошибке:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType length]: unrecognized selector sent to instance 0x16ec2190'*** 

В чем проблема?

EDIT проблема найдена с точки останова для исключения на броске: ПОЛНЫЙ .m:

@synthesize inviteTableSearchBar; 

@synthesize contactsObjects; 
@synthesize facebookObjects; 
@synthesize twitterObjects; 
@synthesize searchResults; 

//lazy instantiations <below>------- 
- (NSArray *)contactsObjects 
{ 
    if(!contactsObjects) 
    { 
     contactsObjects = [[NSArray alloc]init]; 
    } 

    return contactsObjects; 
} 

- (NSMutableArray *)searchResults 
{ 
    if(!searchResults) 
    { 
     searchResults = [[NSMutableArray alloc]init]; 
    } 

    return searchResults; 
} 
//lazy instantiations <above>------- 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    CFErrorRef error = nil; 
    // Request authorization to Address Book 
    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, &error); 

    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { 
     ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) 
     { 
      if (granted) { 
       // First time access has been granted, add all the user's contacts to array. 

       contactsObjects = (__bridge_transfer NSArray *)(ABAddressBookCopyArrayOfAllPeople(addressBookRef)); 
      } else { 
       // User denied access. 
       // Display an alert telling user that they must allow access to proceed to the "invites" page. 
      } 
     }); 
    } 
    else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { 
     // The user has previously given access, add all the user's contacts to array. 

     contactsObjects = (__bridge_transfer NSMutableArray *)(ABAddressBookCopyArrayOfAllPeople(addressBookRef)); 
    } 
    else { 
     // The user has previously denied access 
     // Send an alert telling user that they must allow access to proceed to the "invites" page. 
    } 

    NSLog(@"%@", contactsObjects); 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    //CUSTOM APPEARANCE <below> 

    //set in order to actually change the search bar's UIColor. 
    [self.inviteTableSearchBar setBackgroundImage:[UIImage new]]; 
    [self.inviteTableSearchBar setTranslucent:YES]; 

    self.inviteTableSearchBar.backgroundColor = [UIColor colorWithHexString:@"#333333"]; 
    [[UILabel appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor colorWithHexString:@"#669900"]]; 

    //Uncomment the following line to preserve selection between presentations; YES to clear tableView when the tableViewController recieves `viewWillAppear:` 
    self.clearsSelectionOnViewWillAppear = YES; 

    //Fill array 
    //[self.contactsObjects addObject:@"Examples<below>"]; 
    //[self.contactsObjects addObject:@"John"]; 
    //[self.contactsObjects addObject:@"Sanford"]; 
    //[self.contactsObjects addObject:@"Sally"]; 
    //[self.contactsObjects addObject:@"Susan B. Anthony"]; 

    // Hide the search bar until user scrolls up 
    CGRect newBounds = self.tableView.bounds; 
    newBounds.origin.y = newBounds.origin.y + inviteTableSearchBar.bounds.size.height; 
    self.tableView.bounds = newBounds; 

} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return self.contactsObjects.count; 
} 

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

    //configure the cells 
    cell.textLabel.text = self.contactsObjects[indexPath.row]; 

    return cell; 
} 

Проблема на cell.textLabel.text = self.contactsObjects[indexPath.row]; нижней стороне //configure the cells. в методе cellForRowAtIndexPath:.

+0

Какая линия рушится? –

+0

Извините, я не уверен, что это значение. Если бы это была java, я мог бы, но я не знаю, где это находится на Xcode (теперь отображается полный отчет отладчика) – Chisx

+0

Ничего себе, это не должно быть так сложно. Я потратил весь день, пытаясь понять, как печатать мои контакты на моей консоли, чтобы убедиться, что я их схватил. – Chisx

ответ

0
#define CHECK_NULL_STRING(str) ([str isKindOfClass:[NSNull class]] || !str)[email protected]"":str 

id p=[contactsObjects objectAtIndex:indexPath.row]; 
    NSString *fName=(__bridge NSString *)(ABRecordCopyValue((__bridge ABRecordRef)(p), kABPersonSortByFirstName)); 
     NSString *lName=(__bridge NSString *)(ABRecordCopyValue((__bridge ABRecordRef)(p), kABPersonSortByLastName)); 
cell.textLabel.text=[NSString stringWithFormat:@"%@ %@",CHECK_NULL_STRING(fName),CHECK_NULL_STRING(lName)] 
+0

Гений! Он работает, buttt .. он печатает один и тот же контакт в каждой ячейке .. и я пытаюсь выяснить, почему прямо сейчас ... – Chisx

+0

Я думаю, что это objectAtIndex: 0. Кроме того, я хотел бы также включить имена последних – Chisx

+0

Да, если я изменил его на 'objectAtIndex: 1]' он печатает другое имя и печатает это имя для каждой ячейки в таблицеView. – Chisx

1

Это означает, что вы попытались задать объект по адресу 0x175c4b10 по его длине, но это не объект, который отвечает на метод length. Вероятно, ошибка не указана в коде, который вы отправили, так как вы не делаете никаких вызовов метода length. Возможно, вы звоните в length где-то в другом месте (ищите свой код для чего), или может быть, что вы вызываете метод, который в конечном итоге вызывает length, но вы передаете ему недопустимые параметры.

+0

Есть ли способ, с помощью которого я могу определить, из какого класса этот экземпляр исходит? – Chisx

+0

На самом деле это глупый вопрос, потому что я знаю, на какой странице он разбился на – Chisx

+0

Вы можете добавить точку останова на исключения Objective-C. Для этого откройте панель точек останова, нажмите кнопку «+» и выберите «Добавить точку останова исключения ...». По умолчанию он должен останавливаться на исключениях C++ и Objective-C (я думаю). Это должно привести к остановке вашей программы в отладчике, как только она попадет в проблемную строку. – user1118321