2015-12-02 1 views
0

Мне нужна помощь с помощью APAddressBook.Как показать контакты с APAddressBook в TableView

Я не могу понять, как использовать APAddressBook для загрузки и отображения контактов.

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

func loadContacts() { 
    self.addressBook.loadContacts({ 
     (contacts: [APContact]?, error: NSError?) in 
     if let unwrappedContacts = contacts { 
      print(unwrappedContacts) 

     } else { 
      // show error... 

И эта функция извлекает имена

func contactName(contact :APContact) -> String { 
    if let firstName = contact.name?.firstName, lastName = contact.name?.lastName { 
     return "\(firstName) \(lastName)" 
    } 
    else if let firstName = contact.name?.firstName { 
     return "\(firstName)" 
    } 
    else if let lastName = contact.name?.lastName { 
     return "\(lastName)" 
    } 
    else { 
     return "Unnamed contact" 
    } 
} 

То, что я не понимаю, как отобразить эти имена здесь:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("contacts", forIndexPath: indexPath) as! ContactsTableViewCell 

    // Configure the cell... 
    cell.contactsNumberLabel.text = contactsListNumbers[indexPath.row] 
    cell.contactsNameLabel.text = contactListNames[indexPath.row] 

    return cell 
} 
+0

при выполнении этого кода, что делает unwrappedContacts есть в нем? – Lamar

+0

Хорошо скопированные отпечатки: [, , , , ...] – Xernox

ответ

0

Я не слишком уверен в этой библиотеке, однако мы могли видеть, что unwrappedContacts - это массив, который содержит всю информацию о каждом пользователе из вашего контактного книжки. поэтому наилучшим вариантом будет итерация через этот массив, разложите его, а затем назначьте его новому массиву.

По некоторым исследовательский я сделал это говорит, что эта библиотека содержит FEWS поля, такие как

Available fields: APContactFieldFirstName - contact first name APContactFieldMiddleName - contact middle name APContactFieldLastName - contact last name APContactFieldCompany - contact company (organization) APContactFieldPhones - contact phones array

struct ContactStructure 
{ 
var firstname:String? 
var lastname:String? 
} 

    var arrayOfContacts = [ContactStructure]() 

     for each in unwrappedContacts 
    { 
     var firstname = each.APContactFieldFirstName as! String 
     var lastname = each.APContactFieldLastName as! String 
     var SingleContact = ContactStructure() 
     singleContact.firstname = firstname 
     singleContact.lastname = lastname 
     arrayOfContacts.append(SingleContact) 
     // Then reloadData of the tableView 
    } 

Примечание каждый представляет собой один объект из массива так, когда вы делаете each. вы должны смотреть, чтобы увидеть метод и свойства, выполняемые этим классом или структурой

Затем вы будете использовать это arrayOfContacts для заполнения ваших ячеек таблицы.

+0

Спасибо, сначала это не рабочий, но если вместо 'each.APContactFieldFirstName как! String' Я использовал 'each.name? .firstName', и теперь у меня есть массив имен контактов. – Xernox

+0

Однако у меня проблемы с заполнением ячеек. То, что я сделал, было объявлено 'ContactStructure' и' arrayOfContacts' в начале моего класса, вставлено 'для каждого в unwrappedContacts' в' loadContacts() 'и для' cell.contactsNameLabel.text' пыталось назначить 'arrayOfContacts [indexPath.row ] '. У меня была ошибка: «Не могу индексировать значение типа» [ContactsTableViewController.ContactStructure] '' Я предполагаю, что использую' struct' неправильно? – Xernox

+0

Сообщение, что у вас есть? – Lamar

0

Вот мой довольно много мой полный код:

class ContactsTableViewController: UITableViewController { 

let addressBook = APAddressBook() 

struct ContactStructure { 

    var firstname:String? 
    var lastname:String? 
} 

var arrayOfContacts = [ContactStructure]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    loadContacts()   
} 

func loadContacts() { 
    self.addressBook.loadContacts({ 
     (contacts: [APContact]?, error: NSError?) in 
     if let unwrappedContacts = contacts { 

      for each in unwrappedContacts { 

       let firstname = each.name?.firstName 
       let lastname = each.name?.lastName 
       var singleContact = ContactStructure() 
       singleContact.firstname = firstname 
       singleContact.lastname = lastname 
       self.arrayOfContacts.append(singleContact) 
      } 

     } else if let unwrappedError = error { 
      let alert = UIAlertView(title: "Error", message: unwrappedError.localizedDescription, 
       delegate: nil, cancelButtonTitle: "OK") 
      alert.show() 
     } 
    }) 
} 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // for now 1 should be fine 
    return 1 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! ContactsTableViewCell 

    //Here I get error Cannot subscript a value of type '[ContactsTableViewController.ContactStructure]' 

    cell.nameLabel.text = arrayOfContacts[indexPath.row] 

    return cell 
} 
+0

И вы сказали, что поле имени и фамилии - это массивы – Lamar

+0

Я имел в виду, что в 'for in' loop for' each.name? .firstName' я получаю String, но в конце концов у меня может быть массив из них. – Xernox

 Смежные вопросы

  • Нет связанных вопросов^_^