使用Contacts UI有一些错误,无法找出解决方案

时间:2015-12-07 00:03:30

标签: swift

我正在做一个非常简单的应用程序。单个视图,带一个按钮"添加联系人"和一个表格视图。当我按下"添加联系人"时,我可以选择联系人,然后选择他/她的手机号码。此电话号码将添加到表格视图中 我的代码如下所示。当我按"添加联系人"按钮,它打开联系人,然后我选择一个联系人,然后他的手机号码。但后来没有回应。我确实在输出窗口中看到了一条错误消息:

  

[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) {

    }

}

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。我需要在开头添加CNContactPickerDelegate。我还通过仅使用dequeueReusableCellWithIdentifier修复了表格视图中的一个问题。请注意,dequeueReusableCellWithIdentifierdequeueReusableCellWithIdentifier: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()
    }


}