我正在做一个非常简单的应用程序。单个视图,带一个按钮"添加联系人"和一个表格视图。当我按下"添加联系人"时,我可以选择联系人,然后选择他/她的手机号码。此电话号码将添加到表格视图中 我的代码如下所示。当我按"添加联系人"按钮,它打开联系人,然后我选择一个联系人,然后他的手机号码。但后来没有回应。我确实在输出窗口中看到了一条错误消息:
[CNUI ERROR]已设置选择谓词,但委托未实现contactPicker:didSelectContact:和contactPicker:didSelectContactProperty:。那些谓词将被忽略。
根据该消息,我接着尝试添加contactPicker.delegate =self
,然后它说有错误
无法分配"查看控制器"的值到" CNContactPickerDelegate"
然后我不知道该怎么做。请帮忙。 我之前也搜索过这些问题,有些是相关的,但我仍然无法弄清楚答案。这是我的代码:
import UIKit
import ContactsUI
import Contacts
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var items = [String]()
@IBAction func addContact(sender: AnyObject) {
let contactPicker = CNContactPickerViewController()
contactPicker.delegate = self
contactPicker.displayedPropertyKeys = [CNContactPhoneNumbersKey]
contactPicker.predicateForSelectionOfContact = NSPredicate (value:true)
contactPicker.predicateForSelectionOfProperty = NSPredicate(value: true)
self.presentViewController(contactPicker, animated: true, completion: nil)
}
func contactPicker(picker:CNContactViewController, didSelectContactProperty contactProperty:CNContactProperty) {
let newitem = contactProperty.value as! CNPhoneNumber
items.append(String(newitem))
tableView.reloadData()
print(newitem.stringValue)
}
@IBOutlet weak var tableView: UITableView!
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
cell.textLabel?.text = items[indexPath.row]
return UITableViewCell()
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
}
}
答案 0 :(得分:0)
我解决了这个问题。我需要在开头添加CNContactPickerDelegate
。我还通过仅使用dequeueReusableCellWithIdentifier
修复了表格视图中的一个问题。请注意,dequeueReusableCellWithIdentifier
和dequeueReusableCellWithIdentifier:forIndexPath
是不同的方法。
以下代码有效:
import UIKit
import ContactsUI
import Contacts
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, CNContactPickerDelegate {
var items = [String]()
@IBAction func addContact(sender: AnyObject) {
let contactPicker = CNContactPickerViewController()
contactPicker.displayedPropertyKeys = [CNContactPhoneNumbersKey]
contactPicker.delegate = self
contactPicker.predicateForSelectionOfContact = NSPredicate (value:false)
contactPicker.predicateForSelectionOfProperty = NSPredicate(value: true)
self.presentViewController(contactPicker, animated: true, completion: nil)
}
func contactPicker(picker: CNContactPickerViewController, didSelectContactProperty contactProperty: CNContactProperty) {
let newitem = contactProperty.value as! CNPhoneNumber
items.append(newitem.stringValue)
tableView.reloadData()
print(newitem.stringValue)
}
@IBOutlet weak var tableView: UITableView!
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print(items.count)
return items.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell")
cell!.textLabel?.text = items[indexPath.row]
return cell!
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
}
override func viewDidLoad() {
super.viewDidLoad()
}
}