用segue在另一个ViewController上显示联系人信息



我使用联系人框架来获取用户联系人的姓名、号码、电子邮件和联系人图像,正在获取数据。我现在能显示的只有表视图中的一个键,比如名称,号码或电子邮件,我想让名称被点击然后segue到另一个视图控制器那里显示其他属性。但我有麻烦显示它在其他viewController。我试过在prepareforsegue函数中使用获取联系人方法,似乎不起作用。我用来获取contacts的代码是

 func getContacts() {
    let store = CNContactStore()
    if CNContactStore.authorizationStatusForEntityType(.Contacts) == .NotDetermined {
        store.requestAccessForEntityType(.Contacts, completionHandler: { (authorized: Bool, error: NSError?) -> Void in
            if authorized {
                self.retrieveContactsWithStore(store)
            }
        })
    } else if CNContactStore.authorizationStatusForEntityType(.Contacts) == .Authorized {
        self.retrieveContactsWithStore(store)
    }
    tableView.reloadData()
}

func retrieveContactsWithStore(store: CNContactStore) {
    do {
        let groups = try store.groupsMatchingPredicate(nil)
        // let predicate = CNContact.predicateForContactsInGroupWithIdentifier(groups[0].identifier)
        let containerId = CNContactStore().defaultContainerIdentifier()
        let predicate: NSPredicate = CNContact.predicateForContactsInContainerWithIdentifier(containerId)
        let keysToFetch = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName), CNContactEmailAddressesKey, CNContactPhoneNumbersKey,CNContactImageDataAvailableKey,CNContactThumbnailImageDataKey]
        print(CNContactEmailAddressesKey.capitalizedString)
        let contacts = try store.unifiedContactsMatchingPredicate(predicate, keysToFetch: keysToFetch)
        self.objects = contacts
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            self.tableView.reloadData()
        })
    } catch {
        print(error)
    }
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let identifier  = segue.identifier  {
        if identifier == "DetailContact" {
        }
    }



}

正如我在评论中所说,在另一个控制器中创建一个新的联系人对象。例如:yourContactObject,然后在prepareforsegue中为它设置一些值,如下所示:

var selectedContact;// Your contact which you will set in the did select of the other controller
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let identifier  = segue.identifier  {
        if identifier == "DetailContact" {
            let controller = segue.destinationViewController
            controller.yourContactObject = selectedContact.
        }
    }
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    selectedContact = objects[indexPath.row]
}

而不是试图在prepareForSegue中重新执行查询,在另一个视图控制器上创建属性,例如var contact: CNContactStore!,然后观察在表视图中选择哪一行。因此,在didSelectRowAtIndexPath中,您可以执行以下操作…

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let contactSelected = yourDataModel[indexPath.row] //now you know which contact was selected
    self.performSegueWithIdentifier("DetailContact", sender: contactSelected) 
    /**you can pass the selected contact as the sender argument, 
      or set it as a class-level variable, 
      or use a delegate or notification, all would work */
}

然后在您的prepareForSegue方法中,可以执行以下操作…

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let identifier  = segue.identifier  {
        if identifier == "DetailContact" {
            let controller = segue.destinationViewController
            controller.contact = sender as! CNContactStore
        }
    }
}

最新更新