Parabéns ao @GxocT pela excelente solução! Ajudei imensamente meus usuários.
Mas eu queria compartilhar meu código com base na solução @GxocT, esperando que ajude outras pessoas nesse cenário.
Eu precisava que meu CNContactViewControllerDelegate contactViewController(_:didCompleteWith:)cancelamento fosse cancelado (além de concluído).
Além disso, meu código não estava em um UIViewControllermodo que não háself.navigationController
Eu também não gosto de usar força para desembrulhar quando posso ajudá-lo. Eu fui mordido no passado, então eu acorrentei if letna configuração
Aqui está o que eu fiz:
Estenda CNContactViewControllere coloque a função swizzle
lá.
No meu caso na função swizzle basta ligar para o
CNContactViewControllerDelegatedelegado
contactViewController(_:didCompleteWith:)com selfe
self.contactobjeto do controlador de contato
No código de instalação, verifique se a chamada swizzleMethod
class_getInstanceMethodespecifica a CNContactViewController
classe em vez deself
E o 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)
}
}
O teclado ainda aparece momentaneamente, mas cai logo após o controlador de contatos ser descartado.
Permite que a Apple conserte isso