CNContactPicker - 所有联系人都显示为灰色

时间:2015-10-11 20:39:56

标签: macos swift

我似乎无法让CNContactPicker工作。我已经观看并重新阅读过WWDC会话223.看起来对于iOS版本的选择器,有一个谓词设置为启用联系人选择,但OS X版本没有等价物。根据我的理解,如果您的代理人支持contactPicker(选择器:CNContactPicker,didSelectContact联系人:CNContact)并且您不提供任何显示的键,则选择器将配置为选择联系人。这是示例代码。当我使用它时,联系人都是灰色的,并且永远不会调用委托方法。

提前致谢

func selectContact() {  

    let contactStore = CNContactStore(  
    contactStore.requestAccessForEntityType(CNEntityType.Contacts, completionHandler:{(bool: Bool, error: NSError?) -> Void in  
        print("access granted = \(bool)")  
    })  

    let contactPicker = CNContactPicker()  
    contactPicker.delegate = self  
    contactPicker.showRelativeToRect(NSRect(x: 0, y: 0, width: 200, height: 500), ofView: view, preferredEdge: NSRectEdge.MinX)  

}  

//Delegate method  
func contactPicker(picker: CNContactPicker, didSelectContact contact: CNContact) {  
    print(contact)  
}  

2 个答案:

答案 0 :(得分:3)

这似乎是CNContactPicker的内存管理问题。我设法通过在外部范围内保持对它的引用来实现这一点:

let picker = CNContactPicker()

@IBAction func import(sender: NSButton) {
    picker.delegate = self

    let contactStore = CNContactStore()
    contactStore.requestAccessForEntityType(CNEntityType.Contacts, completionHandler:{(bool: Bool, error: NSError?) -> Void in
        print("access granted = \(bool)")
        if bool {
            dispatch_async(dispatch_get_main_queue()) {
                self. picker.showRelativeToRect(sender.frame, ofView: sender.superview ?? self.view, preferredEdge: .MaxY)
            }
        }
    })
}

func contactPicker(picker: CNContactPicker, didSelectContact contact: CNContact) {
    picker.close()
    print("Chose contact \(contact)!")
}

请注意,所有内容看起来仍然是灰色的(也许它应该看起来像那样?)但至少会调用委托方法。

答案 1 :(得分:0)

我刚遇到同样的问题。进行一些研究后,您可以启用哪些联系人可用,哪些联系人不可用。

看一下Apple的文档中的谓词ForEnablingContact apple documentation

以下是我正在使用它的代码片段。

contactPickerViewController.predicateForEnablingContact = NSPredicate(format: "phoneNumbers.@count > 0")