2015-02-12 1 views
4

Быстрый контекст. У меня есть контроллер просмотра, который имеет возможность добавлять друзей, нажав кнопку UIButton. Я хочу настроить этот контроллер, а не использовать peoplepicker, поэтому я создал свой собственный tableview, который заполняю информацией из адресной книги. Во-первых, я прошу пользователя, нормально ли получить доступ к их адресной книге. Затем я помещал имена своих контактов в массив, чтобы заполнить таблицу. Самое странное, однако, что имена не отображаются в ячейках таблицы до тех пор, пока вы сначала не прокрутите таблицу. Когда я останавливаюсь, снова начинаю или просто расслабляюсь и возвращаюсь, ячейки заполняются так, как вы ожидали. Когда я перезапускаю контент и перезапускаю, происходит то же самое, когда имена не отображаются в ячейках до тех пор, пока вы не прокрутите список. Любые мысли о том, что может произойти? Заранее спасибо!Ячейки UITableview не отображаются до тех пор, пока вы не прокрутите

import UIKit 
import AddressBook 

class ContactsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    @IBOutlet weak var namesTableView: UITableView! 

    var addressBook: ABAddressBook! 
    var names:[String]? 

    func createAddressBook() { 

     var error: Unmanaged<CFErrorRef>? 

     addressBook = ABAddressBookCreateWithOptions(nil, &error).takeRetainedValue() 

    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.namesTableView.delegate = self 
     self.namesTableView.dataSource = self 

     accessAddressBook() 

     self.namesTableView.backgroundColor = UIColor(red: 74/255, green: 144/255, blue: 226/255, alpha: 1) 
     self.namesTableView.allowsMultipleSelection = true 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func accessAddressBook() { 

     switch ABAddressBookGetAuthorizationStatus(){ 
     case .Authorized: 
      println("Already authorized") 
      createAddressBook() 
      self.beginContactSearch() 

     case .Denied: 
      println("You are denied access to the address book") 

     case .NotDetermined: 
      createAddressBook() 
      if let theBook: ABAddressBook = addressBook { 

       ABAddressBookRequestAccessWithCompletion(theBook, {(granted: Bool, error: CFError!) in 

        if granted { 

         println("Access is granted") 
         self.beginContactSearch() 
        } 
        else { 

         println("Access is not granted") 
        } 
       }) 
      } 
     case .Restricted: 
      println("Access is restricted") 

     default: 
      println("Unhandled") 
     } 

    } 

    func beginContactSearch(){ 
     let records = ABAddressBookCopyArrayOfAllPeople(self.addressBook).takeRetainedValue() as NSArray as [ABRecord] 
     names = Array() 
     for record in records { 
      let object = ABRecordCopyCompositeName(record) 
      if object.toOpaque() == COpaquePointer.null() { 

      } else { 
       var name = object.takeRetainedValue() as NSString 
       self.names!.append(name) 
      } 
      self.namesTableView.reloadData() 
     } 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return self.names?.count ?? 0 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = namesTableView.dequeueReusableCellWithIdentifier("Tablecell") as UITableViewCell 

     cell.textLabel!.text = names![indexPath.row] 
     cell.textLabel?.textColor = UIColor.whiteColor() 
     cell.backgroundColor = UIColor(red: 74/255, green: 144/255, blue: 226/255, alpha: 1) 

     return cell 
    } 

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     var selectedCell:UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)! 
     selectedCell.contentView.backgroundColor = UIColor.whiteColor() 
     selectedCell.textLabel?.textColor = UIColor(red: 74/255, green: 144/255, blue: 226/255, alpha: 1) 

     println("User selected: \(self.names?[indexPath.row])") 

    } 

    func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) { 
     var cellToDeSelect:UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)! 

     cellToDeSelect.textLabel?.textColor = UIColor.whiteColor() 

    } 

} 

ответ

5

Запустите .reloadData на главной теме:

dispatch_async(dispatch_get_main_queue()) { 
    self.namesTableView.reloadData() 
} 

и он должен работать.

0

Сначала удалите это заявление self.namesTableView.reloadData() из цикла следует позвонить, как только вы получите Tableview массиву

Использование Отправка асинхронной избежать операции в основном потоке

Swift

DispatchQueue.main.async { 
    // RELOAD TABLE DATA 
} 

Цель-C

dispatch_async(dispatch_get_main_queue(), ^{ 
    // RELOAD TABLE DATA 
}); 

Если данные требуется использовать тогда время спины вызовов т.е. обработчик завершения и в использовании обработчика отправки асинхронном, чтобы перезагрузить данные таблицы, как упоминается выше

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