【问题标题】:CNContactPicker - all contacts are greyed outCNContactPicker - 所有联系人都显示为灰色
【发布时间】:2015-10-11 20:39:56
【问题描述】:

我似乎无法让 CNContactPicker 工作。我已经观看并重新观看了 WWDC 会话 223。看起来对于 iOS 版本的选择器,您设置了一个谓词来启用联系人进行选择,但 OS X 版本没有等效项。据我了解,如果您的代表支持 contactPicker(picker: CNContactPicker, didSelectContact contact: 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)  
}  

【问题讨论】:

  • 您有访问权限吗? (这并不重要;在 iOS 上,您不需要访问权限即可使用选择器。)
  • 另一种可能是这东西刚刚坏掉了。很多联系人 UI 的东西在 iOS 上损坏了,那么 OS X 为什么要分担痛苦呢? :)
  • 当我运行它时,打印命令返回 true。我有这个来验证它不是访问问题。有趣的是很多联系人 UI 的东西被破坏了;这让我觉得可能没有针对选择器问题的当前解决方案:|
  • 我刚刚测试了选择器,它可以工作。但是你说得对,联系人是灰色的。

标签: macos swift


【解决方案1】:

这似乎是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)!")
}

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

【讨论】:

  • 谢谢!我敢打赌,他们在 Mac 的 API 中忘记了一个谓词。似乎在 iOS 中,您将谓词设置为使它们不灰显。
【解决方案2】:

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

看看这个,来自 Apple 文档的 predicateForEnablingContact apple documentation

这是我如何使用它的 sn-p 代码。

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

【讨论】:

  • 是的,这在 UIKit 中有效,但在 AppKit 中,CNContactPicker 类对应项似乎没有等效的 predicateForEnablingContact 属性。几乎就像他们忘记在 AppKit 中构建它一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 2021-09-11
相关资源
最近更新 更多