Я пишу приложение для чата. Я сейчас в точке, где можно начать новый чат.Перейти к новому представлению после контакта выберите из CNContactPickerViewController
Что я хочу, так это то, что когда пользователь выбирает контакт с помощью CNContactPickerViewController
, сборщик отклоняется (это работает), и контактные данные отправляются в новое окно чата (это не работает). Ошибка, которую я получаю, заключается в том, что в func contactPicker
delegate
возвращает 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 фиксировало переход, который не работает.
Показать экран вашей истории. –
Спасибо за быстрый ответ Nirav, здесь: http://imgur.com/ZiOzndu – Kevin
Из раскадровки 'ChatViewController' - ваш первый экран. Правильно? –