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 UIViewController
modo 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 let
na configuração
Aqui está o que eu fiz:
Estenda CNContactViewController
e coloque a função swizzle
lá.
No meu caso na função swizzle basta ligar para o
CNContactViewControllerDelegate
delegado
contactViewController(_:didCompleteWith:)
com self
e
self.contact
objeto do controlador de contato
No código de instalação, verifique se a chamada swizzleMethod
class_getInstanceMethod
especifica 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