目前我正在开发我的第一个iOS应用程序,我对代码有点慢和粗鲁(它是如此奇怪,与java不同),如果这是唯一的问题,新的更新,Xcode使我的代码疯狂.我想我解决了大部分问题,但......
之前,在其中一个屏幕上,应用程序打开了一个地址簿,让用户点击一个; 点击完成后,联系人列表关闭,该联系人的数据被检索到控制器.现在,如果用户单击某个联系人,则会显示更多信息,但任何信息都会从控制台日志中显示出来.
我尝试在网上找到的所有内容,但我不确定为什么不起作用.
以前,我使用Addressbook(或类似的东西),但我已经尝试过CNContact.
@IBAction func addNewContactOnClick(_ sender: AnyObject) {
let peoplePicker = CNContactPickerViewController()
peoplePicker.delegate = self
self.present(peoplePicker, animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)
func contactPicker(picker: CNContactPickerViewController, didSelectContacts contacts: [CNContact]){
contacts.forEach { contact in
for number in contact.phoneNumbers {
let phoneNumber = number.value as! CNPhoneNumber
print("number is = \(phoneNumber)")
}
}
}
func contactPickerDidCancel(picker: CNContactPickerViewController) {
print("Cancel Contact Picker")
}
Run Code Online (Sandbox Code Playgroud) 最近我从旧的ABAddressBook框架切换到新的CNContacts.在我的项目中,我将本机的联系人与我自己的核心数据联系人同步.为此,我使用联系人标识符和电话标识符来同步电话号码.
但我观察到有趣的事情,当我尝试编辑联系人时,我称这行代码
func getContact() -> CNContact? {
let contactStore = CNContactStore()
guard let contactRecord = try? contactStore.unifiedContact(withIdentifier: "8222B6F1-DE99-4099-82A4-47EAB9206A94:ABPerson", keysToFetch: [CNContactViewController.descriptorForRequiredKeys()]) else {
return nil
}
return contactRecord
}
@IBAction func showContact() {
let contactViewController = CNContactViewController(forNewContact: self.getContact())
contactViewController.delegate = self
contactViewController.title = "New Contact"
let navigationController = UINavigationController(rootViewController: contactViewController)
navigationController.navigationBar.isTranslucent = false
self.present(navigationController, animated: true, completion: nil)
}
func contactViewController(_ viewController: CNContactViewController, didCompleteWith contact: CNContact?) {
let newContact = self.getContact()
viewController.dismiss(animated: false, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)
这很简单.但是如果在CNContactViewController中我编辑用户照片,电话标识符将会改变,即使我没有编辑该控制器中的电话号码.电话标识符可以像这样轻松打印:
po newContact?.phoneNumbers.first?.identifier
Run Code Online (Sandbox Code Playgroud)
这真的搞砸了我的同步,因为用户可能只是更换照片,但电话号码的标识符会改变,我将无法知道发生了什么.如果我编辑其他一些数据,如人名,公司等,这个标识符将不会改变......即使我将手机编辑为其他值,它也会保持不变.但由于某些原因,更改照片会让它完全混乱.
有没有人观察过这个? …
这似乎特定于iOS 13.1,因为它可以在iOS 13.0和更早版本上按预期工作,并在CNContactViewController中添加联系人,如果我“取消”,则操作表被键盘重叠。没有执行任何操作,也没有关闭键盘。
swift cncontact cncontactstore cncontactviewcontroller ios13
当我按下a中CNContactViewController的UITableViewController子类堆栈时UINavigationController,顶部导航栏几乎完全隐藏.但是随着亮度一直向上,你会看到后面的箭头,然后是"细节"和系统状态栏.当我点击屏幕的那个角落时,CNContactViewController确实被解雇了.
当然这不好,因为用户可能甚至看不到导航栏的文本,现在按任何按钮来解除.
有没有办法让CNContactViewController的导航栏色调与显示它的视图控制器(我的应用程序的其余部分)相同?
CNContactViewController *controller = [CNContactViewController viewControllerForUnknownContact:person];
controller.contactStore = [[CNContactStore alloc] init];
controller.delegate = self;
controller.allowsActions = NO;
[self.navigationController pushViewController:controller animated:YES];
Run Code Online (Sandbox Code Playgroud)
我应该注意到我只是在iOS 10上遇到这个问题,而不是10以下的版本.当我点击"添加到现有联系人"时,我也得到了正确着色的导航栏,但是当该视图控制器被解除时它再次中断.
所以再一次,我的问题是:有没有办法让CNContactViewController的导航栏色调与显示它的视图控制器(我的应用程序的其余部分)相同?
我正在使用 Native CNContactViewController 添加联系人,一旦保存了联系人,它就会返回带有“:ABPerson”后缀的联系人标识符,当我在联系人列表中交叉检查时,同一联系人会显示不同的标识符。
有谁知道如何获取实际的联系人标识符?
创建代码:
- (IBAction)didSelectedAddContact:(id)sender {
CNMutableContact *contact = [CNMutableContact new];
CNContactViewController *contactController = [CNContactViewController viewControllerForNewContact:contact];
NSLog(@"contact id : %@", contact.identifier);
contactController.allowsEditing = true;
contactController.allowsActions = true;
contactController.delegate = self;
[self.navigationController pushViewController:contactController animated:YES];
}
Run Code Online (Sandbox Code Playgroud)
委托回调:
- (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact{
_contact = contact;
[viewController.navigationController popViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)
下面的函数返回 nil:
- (CNContact*) getContactFromStoreForIdentifier:(NSString*) identifier
{
CNContact *updatedContact = nil;
id descriptor = [CNContactViewController descriptorForRequiredKeys];
CNContactStore *store = [CNContactStore new];
NSError *error;
updatedContact = [store unifiedContactWithIdentifier:identifier
keysToFetch:@[descriptor]
error:&error];
// …Run Code Online (Sandbox Code Playgroud) 在iOS CNContactViewController- >中Add New Contact screen,当用户开始在任何字段中键入文本时,例如(名字,姓氏或公司等)取消按钮会在文本更改后不断闪烁.
我不想要取消按钮的闪光/轻弹动画.任何帮助将不胜感激.
实际结果:取消按钮在文本更改时闪烁/轻弹.
预期结果:闪烁/轻弹不应该在那里.
我们的色调是白色的.我们的应用程序使用CNContactViewController.在我们使用针对iOS 8和9的Xcode 7构建的商店中的应用程序版本中,如果您是iOS 9,我们调用了CNContactViewController.后退按钮为白色,但后面有一个灰色导航栏.在我们使用针对iOS 9和10的Xcode 8进行的开发构建中,没有灰色条,因此后退按钮在白色顶部是白色的,很难看到阴影.
有没有其他人在Xcode版本/ SDK版本之间经历过CNContactViewController的导航区域已经改变的变化?在我们的应用程序中可能会有一些其他更改会影响此栏吗?
编辑:这是我们最新版本中的图像.我确实删除了一些个人信息,所以这是中间的方框,但你可以在左上方看到很难看到后退按钮.
编辑:这是我们在整个应用程序中设置颜色的方式.如果白色后退按钮也使用红色的条形色调而不是任何东西,那么白色后退按钮就不会出现问题
UINavigationBar.appearance().barTintColor = UIColor.red
UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
Run Code Online (Sandbox Code Playgroud)
我们使用的代码将其推送到具有红色条和白色按钮的现有导航控制器:
let ucvc = CNContactViewController(forUnknownContact: contact)
ucvc.delegate = self
ucvc.allowsEditing = true
ucvc.allowsActions = true
ucvc.alternateName = name()
ucvc.contactStore = CNContactStore()
self.navigationController?.pushViewController(ucvc, animated: true)
Run Code Online (Sandbox Code Playgroud)