2016-06-17 1 views
0

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

Что я хочу, так это то, что когда пользователь выбирает контакт с помощью CNContactPickerViewController, сборщик отклоняется (это работает), и контактные данные отправляются в новое окно чата (это не работает). Ошибка, которую я получаю, заключается в том, что в func contactPickerdelegate возвращает nil. Я слежу за this учебником по получению контактных данных из чата s ViewController to ChatViewController. Соответствующий код:

import UIKit 
import Contacts 
import ContactsUI 

class ChatsViewController: UITableViewController, CNContactPickerDelegate { 
    var chats:[Chat] = chatData 
    var selectedContact: CNContact = CNContact() 
    @IBAction func createNewChat(sender: AnyObject) { 
     let contactPickerViewController = CNContactPickerViewController() 
     contactPickerViewController.delegate = self 
     presentViewController(contactPickerViewController, animated: true, completion: nil) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Uncomment the following line to preserve selection between presentations 
     // self.clearsSelectionOnViewWillAppear = false 
     // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
     // self.navigationItem.rightBarButtonItem = self.editButtonItem() 
    } 

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

    // MARK: - Table view data source 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     return chats.count 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("ChatCell", forIndexPath: indexPath) as! ChatCell 

     let chat = chats[indexPath.row] as Chat 
     cell.chat = chat 
     return cell 
    } 

    func contactPicker(picker: CNContactPickerViewController, didSelectContact contact: CNContact) { 
     self.selectedContact = contact 
     self.performSegueWithIdentifier("idContactSelected", sender: self) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "idContactSelected" { 
      let chatVC = segue.destinationViewController as! ChatViewController 
      chatVC.contact = self.selectedContact 
     } 
    } 
} 

И это новый чат ViewController.

import UIKit 
import Contacts 
import ContactsUI 

class ChatViewController: UIViewController { 

    @IBOutlet weak var testLabel: UILabel! 
    var contact: CNContact = CNContact() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 
     self.testLabel.text = contact.givenName 
    } 

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

Так резюмировать: У меня есть ViewController, я могу нажать на кнопку там, чтобы начать новый чат, который открывает контакт сборщика. Как только контакт выбран, выполняется func contactPicker, но контактные данные никогда не отправляются, и не появляется новый чат ViewController, а delegate - nil. Почему это происходит? Я предполагаю, что это потому, что delegate никогда не устанавливается, только создается, но в учебнике это все, что они делают, и, похоже, это работает.

Заранее благодарим за любые мысли по этому поводу.

EDIT: Решение в конце: мне не нужен делегат, я могу просто передавать данные через prepareForSegueWithIdentifier. Кроме того, segue не был подключен должным образом, повторное подключение segue фиксировало переход, который не работает.

+0

Показать экран вашей истории. –

+0

Спасибо за быстрый ответ Nirav, здесь: http://imgur.com/ZiOzndu – Kevin

+0

Из раскадровки 'ChatViewController' - ваш первый экран. Правильно? –

ответ

1

Попробуйте что-нибудь подобное. Изменение кода что-то вроде этого

ChatsViewController

import UIKit 
import Contacts 
import ContactsUI 

class ChatsViewController: UITableViewController, CNContactPickerDelegate { 
    var chats:[Chat] = chatData 
    var selectedContact: CNContact = CNContact() 
    @IBAction func createNewChat(sender: AnyObject) { 
     let contactPickerViewController = CNContactPickerViewController() 
     contactPickerViewController.delegate = self 
     presentViewController(contactPickerViewController, animated: true, completion: nil) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Uncomment the following line to preserve selection between presentations 
     // self.clearsSelectionOnViewWillAppear = false 
     // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
     // self.navigationItem.rightBarButtonItem = self.editButtonItem() 
    } 

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

    // MARK: - Table view data source 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     return chats.count 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("ChatCell", forIndexPath: indexPath) as! ChatCell 

     let chat = chats[indexPath.row] as Chat 
     cell.chat = chat 
     return cell 
    } 

    func contactPicker(picker: CNContactPickerViewController, didSelectContact contact: CNContact) { 
     self.selectedContact = contact 
     self.performSegueWithIdentifier("idContactSelected", sender: self) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "idContactSelected" { 
      let chatVC = segue.destinationViewController as! ChatViewController 
      chatVC.contact = self.selectedContact 
     } 
    } 
} 

После этого измените ChatViewController

import UIKit 
import Contacts 
import ContactsUI 
class ChatViewController: UIViewController { 

    @IBOutlet weak var testLabel: UILabel! 
    var contact: CNContact = CNContact() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 
     self.testLabel.text = contact.givenName 
    } 

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

Надеется, что это поможет вам.

+0

Большое спасибо! Это больше не терпит крах (потому что делегат не работает), однако он не представляет «ChatViewController». Я не получаю никаких ошибок. EDIT: я читал, что 'executeSegueWithIdentifier' нужно вызывать из основного потока пользовательского интерфейса, поэтому я инкапсулировал его в' dispatch_async (dispatch_get_main_queue()) '. Это не работает, потому что тогда вид не находится в иерархии окон. – Kevin

+0

Просто попробуйте мой ответ, он решит всю вашу проблему. –

+0

Используя мой ответ, вы также получите выбранный контакт также в 'ChatViewController'. –

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