Ios 使用segue在另一个ViewController上显示联系人信息
Im使用contact framework获取用户联系人的姓名、号码、电子邮件和联系人图像,正在获取数据。我现在能显示的只是表视图中的一个键,比如名称编号或电子邮件,我希望单击名称,然后转到其他视图控制器,在那里显示其余属性。但是我在另一个Ios 使用segue在另一个ViewController上显示联系人信息,ios,swift,uitabbarcontroller,segue,contacts-framework,Ios,Swift,Uitabbarcontroller,Segue,Contacts Framework,Im使用contact framework获取用户联系人的姓名、号码、电子邮件和联系人图像,正在获取数据。我现在能显示的只是表视图中的一个键,比如名称编号或电子邮件,我希望单击名称,然后转到其他视图控制器,在那里显示其余属性。但是我在另一个viewController上显示它时遇到问题。我曾尝试在prepareforsgue函数中使用get contacts方法,但似乎不起作用。我用于获取联系人的代码是 func getContacts() { let store = CNContac
viewController
上显示它时遇到问题。我曾尝试在prepareforsgue
函数中使用get 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
,然后在prepare For segue中为其设置一些值,如下所示:
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]
}
不要试图在prepareforsgue
中重新执行查询,而是在另一个视图控制器上创建一个属性,例如var contact:CNContactStore
然后观察在表视图中选择的行。因此,在didselectrowatinexpath
中,您可以执行以下操作
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 */
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let identifier = segue.identifier {
if identifier == "DetailContact" {
let controller = segue.destinationViewController
controller.contact = sender as! CNContactStore
}
}
}
然后在您的prepareforsgue
方法中,可以执行以下操作
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 */
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let identifier = segue.identifier {
if identifier == "DetailContact" {
let controller = segue.destinationViewController
controller.contact = sender as! CNContactStore
}
}
}
prepareforsgue
方法在哪里?您可以在其他视图控制器中添加属性,并在prepareToSegue中传递所选联系人。您不需要再次获取联系人。已添加联系人!它现在在那里