¡Felicitaciones a @GxocT por la gran solución! Ayudé a mis usuarios inmensamente.
Pero quería compartir mi código basado en la solución @GxocT con la esperanza de que ayude a otros en este escenario.
Necesitaba que me CNContactViewControllerDelegate contactViewController(_:didCompleteWith:)llamaran para cancelar (y listo).
Además, mi código no estaba en un, UIViewControllerasí que no hayself.navigationController
Tampoco me gusta usar desenvolturas forzadas cuando puedo evitarlo. He sido mordido en el pasado, así que encadené if lets en la configuración
Esto es lo que hice:
Extienda CNContactViewControllery coloque la función swizzle
allí.
En mi caso, en la función swizzle simplemente llame al
CNContactViewControllerDelegatedelegado
contactViewController(_:didCompleteWith:)con selfy
self.contactobjeto desde el controlador de contacto
En el código de configuración, asegúrese de que la llamada swizzleMethod
class_getInstanceMethodespecifique la CNContactViewController
clase en lugar deself
Y el código Swift:
class MyClass: CNContactViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.changeImplementation()
}
func changeCancelImplementation() {
let originalSelector = Selector(("editCancel:"))
let swizzledSelector = #selector(CNContactViewController.cancelHack)
if let originalMethod = class_getInstanceMethod(object_getClass(CNContactViewController()), originalSelector),
let swizzledMethod = class_getInstanceMethod(object_getClass(CNContactViewController()), swizzledSelector) {
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}
func contactViewController(_ viewController: CNContactViewController, didCompleteWith contact: CNContact?) {
// dismiss the contacts controller as usual
viewController.dismiss(animated: true, completion: nil)
// do other stuff when your contact is canceled or saved
...
}
}
extension CNContactViewController {
@objc func cancelHack() {
self.delegate?.contactViewController?(self, didCompleteWith: self.contact)
}
}
El teclado todavía se muestra momentáneamente pero se cae justo después de que el controlador de Contactos se desconecta.
Esperemos que Apple arregle esto