iOS中如何清除未保存的联系人草稿?
联系人表单取消后重复弹窗问题
操作步骤
- 打开默认联系人表单添加号码
- 添加号码后点击「取消」,弹出确认弹窗
- 选择「放弃更改」关闭弹窗
异常现象
每次打开通讯录时,都会先弹出包含上次从应用添加到联系人表单的最后一个号码的弹窗
相关代码
主逻辑代码
[self updateRecord:contact withData:contactData]; CNContactViewController *controller = [CNContactViewController viewControllerForNewContact:contact]; controller.delegate = self; dispatch_async(dispatch_get_main_queue(), ^{ UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:controller]; UIViewController *viewController = (UIViewController*)[[[[UIApplication sharedApplication] delegate] window] rootViewController]; while (viewController.presentedViewController) { viewController = viewController.presentedViewController; } [viewController presentViewController:navigation animated:YES completion:nil]; self->updateContactPromise = resolve;
代理方法代码
[viewController dismissViewControllerAnimated:YES completion:nil]; if(updateContactPromise) { if (contact) { NSDictionary *contactDict = [self contactToDictionary:contact withThumbnails:true]; updateContactPromise(contactDict); } else { updateContactPromise(nil); } updateContactPromise = nil; } }
问题原因与解决方案
问题出在复用了已修改的contact对象创建新联系人表单,系统可能会缓存这个临时联系人数据,导致下次打开通讯录时重复弹出。
解决方法:
- 每次创建新联系人表单时,初始化一个全新的
CNMutableContact实例,而不是复用已有的contact对象:
// 替换原有的contact初始化逻辑,创建全新的可变联系人 CNMutableContact *newContact = [[CNMutableContact alloc] init]; [self updateRecord:newContact withData:contactData]; CNContactViewController *controller = [CNContactViewController viewControllerForNewContact:newContact];
- 确保在代理方法处理取消(
contact为nil)时,清空可能保留的临时联系人相关引用,避免缓存残留。
这样可以避免系统保留上次未保存的联系人数据,解决重复弹窗的问题。
内容的提问来源于stack exchange,提问作者Aniruddh kukadiya
相关产品推荐
相关产品推荐

