¡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, UIViewController
así que no hayself.navigationController
Tampoco me gusta usar desenvolturas forzadas cuando puedo evitarlo. He sido mordido en el pasado, así que encadené if let
s en la configuración
Esto es lo que hice:
Extienda CNContactViewController
y coloque la función swizzle
allí.
En mi caso, en la función swizzle simplemente llame al
CNContactViewControllerDelegate
delegado
contactViewController(_:didCompleteWith:)
con self
y
self.contact
objeto desde el controlador de contacto
En el código de configuración, asegúrese de que la llamada swizzleMethod
class_getInstanceMethod
especifique 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