我正在为iOS联系人开发Tinder刷卡应用程序。我已导入联系人库,并成功获取了要在控制台中打印的联系人。但是,我试图将这些名称动态添加到Tinder之类的卡中。我创建了一个模型类来保存名称,但是,我无法将数据附加到该模型中。
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
namespace Dell.Client.Framework.AutoUpdateBootstrapper
{
[RunInstaller(true)] //This attribute is true.
public partial class ProjectInstaller : Installer
{
public ProjectInstaller()
{
InitializeComponent();
}
protected override void OnAfterInstall(IDictionary savedState)
{
base.OnAfterInstall(savedState);
using (System.ServiceProcess.ServiceController serviceController = new System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName))
{
serviceController.Start();
}
}
}
}
我希望所有联系人都附加到模型变量,然后将其返回给卡片。
答案 0 :(得分:0)
据我了解,enumerateContacts
是异步的。这意味着,当您的应用正在执行创建userModels
数组的行时,尚未提取联系人:因此您的数组保持为空。
我会尝试将userModels
数组的创建移动到另一个正在显示卡的控制器中。
要实现此目的,您可以使用一个委托,该委托将获取的联系人作为参数接收。然后,您可以为阵列分配此参数内容并创建卡的内容。
这里是great tutorial on how to use a delegate with Swift。
希望这会对您有所帮助。
答案 1 :(得分:0)
我为此创建了帮助程序类。那可能对您有帮助。 示例
ContactSyncHelper.sharedInstance.getAllContacts { (contacts, error) in
if error {
print("error")
}else {
print(contacts)
}
}
ContactSyncHelper
import UIKit
import Foundation
import Contacts
let kphone_number = "phone_number"
let kcountry_code = "country_code"
class ContactSyncHelper: NSObject {
static let sharedInstance: ContactSyncHelper = {
let instance = ContactSyncHelper()
// setup code
return instance
}()
// MARK: - Initialization Method
override init() {
super.init()
}
//Example
// ContactSyncHelper.sharedInstance.getAllContacts { (contacts, error) in
// if error {
// print("error")
// }else {
// print(contacts)
// }
// }
func getAllContacts(completion: ([NSMutableDictionary],Bool) -> ()) {
switch CNContactStore.authorizationStatus(for: .contacts) {
// Update our UI if the user has granted access to their Contacts
case .authorized:
break
// Prompt the user for access to Contacts if there is no definitive answer
case .notDetermined :
completion([],true)
break
// Display a message if the user has denied or restricted access to Contacts
case .denied,
.restricted:
//CommData.showAlert(self, withMsg: "Permission was not granted for Contacts.", withTitle: "Privacy Warning!", action: nil)
completion([],true)
break
}
let contactStore = CNContactStore()
let keysToFetch = [
CNContactFormatter.descriptorForRequiredKeys(for: .fullName),
CNContactEmailAddressesKey,
CNContactPhoneNumbersKey,
CNContactImageDataAvailableKey,
CNContactThumbnailImageDataKey] as [Any]
// Get all the containers
var allContainers: [CNContainer] = []
do {
allContainers = try contactStore.containers(matching: nil)
} catch {
print("Error fetching containers")
}
var arrayNumbers: [NSMutableDictionary] = []
for container in allContainers {
let fetchPredicate = CNContact.predicateForContactsInContainer(withIdentifier: container.identifier)
do {
let containerResults = try contactStore.unifiedContacts(matching: fetchPredicate, keysToFetch: keysToFetch as! [CNKeyDescriptor])
containerResults.forEach { (contact:CNContact) in
contact.phoneNumbers.forEach { (justPhone:CNLabeledValue) in
let numberValue = justPhone.value
let countryCode = numberValue.value(forKey: "countryCode") as? String
var strphone = numberValue.stringValue
strphone = strphone.replacingOccurrences(of: "(", with: "")
strphone = strphone.replacingOccurrences(of: ")", with: "")
strphone = strphone.replacingOccurrences(of: "-", with: "")
strphone = strphone.replacingOccurrences(of: "+", with: "")
strphone = strphone.components(separatedBy: .whitespaces).joined()
if strphone.hasPrefix("0"){
strphone.remove(at: (strphone.startIndex))
}
if(countryCode != nil)
{
var countryCode1:String = self.getCountryPhonceCode(country: countryCode!)
if strphone.hasPrefix(countryCode1) {
strphone = strphone.deletingPrefix(countryCode1)
}
countryCode1 = "+\(countryCode1)"
let dict = NSMutableDictionary()
dict.setValue(strphone, forKey: kphone_number)
dict.setValue(countryCode1, forKey: kcountry_code)
arrayNumbers.append(dict)
}
}
}
} catch {
print("Error fetching results for container")
}
}
completion(arrayNumbers,false)
}
func getCountryPhonceCode (country : String) -> String
{
if country.count == 2
{
let x : [String] = ["972","IL","93","AF","355","AL","213","DZ","1","AS","376","AD","244","AO","1","AI","1","AG","54","AR","374","AM","297","AW","61","AU","43","AT","994","AZ","1","BS","973","BH","880","BD","1","BB","375","BY","32","BE","501","BZ","229","BJ","1","BM","975","BT","387","BA","267","BW","55","BR","246","IO","359","BG","226","BF","257","BI","855","KH","237","CM","1","CA","238","CV","345","KY","236","CF","235","TD","56","CL","86","CN","61","CX","57","CO","269","KM","242","CG","682","CK","506","CR","385","HR","53","CU" ,"537","CY","420","CZ","45","DK" ,"253","DJ","1","DM","1","DO","593","EC","20","EG" ,"503","SV","240","GQ","291","ER","372","EE","251","ET","298","FO","679","FJ","358","FI","33","FR","594","GF","689","PF","241","GA","220","GM","995","GE","49","DE","233","GH","350","GI","30","GR","299","GL","1","GD","590","GP","1","GU","502","GT","224","GN","245","GW","595","GY","509","HT","504","HN","36","HU","354","IS","91","IN","62","ID","964","IQ","353","IE","972","IL","39","IT","1","JM","81","JP","962","JO","77","KZ","254","KE","686","KI","965","KW","996","KG","371","LV","961","LB","266","LS","231","LR","423","LI","370","LT","352","LU","261","MG","265","MW","60","MY","960","MV","223","ML","356","MT","692","MH","596","MQ","222","MR","230","MU","262","YT","52","MX","377","MC","976","MN","382","ME","1","MS","212","MA","95","MM","264","NA","674","NR","977","NP","31","NL","599","AN","687","NC","64","NZ","505","NI","227","NE","234","NG","683","NU","672","NF","1","MP","47","NO","968","OM","92","PK","680","PW","507","PA","675","PG","595","PY","51","PE","63","PH","48","PL","351","PT","1","PR","974","QA","40","RO","250","RW","685","WS","378","SM","966","SA","221","SN","381","RS","248","SC","232","SL","65","SG","421","SK","386","SI","677","SB","27","ZA","500","GS","34","ES","94","LK","249","SD","597","SR","268","SZ","46","SE","41","CH","992","TJ","66","TH","228","TG","690","TK","676","TO","1","TT","216","TN","90","TR","993","TM","1","TC","688","TV","256","UG","380","UA","971","AE","44","GB","1","US","598","UY","998","UZ","678","VU","681","WF","967","YE","260","ZM","263","ZW","591","BO","673","BN","61","CC","243","CD","225","CI","500","FK","44","GG","379","VA","852","HK","98","IR","44","IM","44","JE","850","KP","82","KR","856","LA","218","LY","853","MO","389","MK","691","FM","373","MD","258","MZ","970","PS","872","PN","262","RE","7","RU","590","BL","290","SH","1","KN","1","LC","590","MF","508","PM","1","VC","239","ST","252","SO","47","SJ","963","SY","886","TW","255","TZ","670","TL","58","VE","84","VN","284","VG","340","VI","678","VU","681","WF","685","WS","967","YE","262","YT","27","ZA","260","ZM","263","ZW"]
var keys = [String]()
var values = [String]()
let whitespace = NSCharacterSet.decimalDigits
//let range = phrase.rangeOfCharacterFromSet(whitespace)
for i in x {
// range will be nil if no whitespace is found
// if (i.rangeOfCharacterFromSet(whitespace) != nil) {
if (i.rangeOfCharacter(from: whitespace, options: String.CompareOptions.caseInsensitive) != nil) {
values.append(i)
}
else {
keys.append(i)
}
}
let countryCodeListDict:NSDictionary = NSDictionary(objects: values as [String], forKeys: keys as [String] as [NSCopying])
if let _: AnyObject = countryCodeListDict.value(forKey: country.uppercased()) as AnyObject {
return countryCodeListDict[country.uppercased()] as! String
} else
{
return ""
}
}
else
{
return ""
}
}
}