Спасибо @GxocT за отличный обходной путь! Очень помог моим пользователям.
Но я хотел поделиться своим кодом на основе решения @GxocT, надеясь, что это поможет другим в этом сценарии.
Мне нужно, чтобы мой CNContactViewControllerDelegate
contactViewController(_:didCompleteWith:)
вызывался при отмене (так же как и сделано).
Также мой код не был в UIViewController
, поэтому нет self.navigationController
Мне также не нравится использовать принудительные развёртки, когда я могу помочь. Я был укушен в прошлом, поэтому я приковал if let
s в настройке
Вот что я сделал:
Расширение CNContactViewController
и поместите функцию Swizzle в
там.
В моем случае в функции swizzle просто вызовите
CNContactViewControllerDelegate
делегата
contactViewController(_:didCompleteWith:)
с self
и
self.contact
объектом из контактаконтроллер
В коде настройки убедитесь, что вызов swizzleMethod для class_getInstanceMethod
указывает класс CNContactViewController
вместо self
И код 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)
}
}
Клавиатура по-прежнему отображается на мгновение, но падает сразу после закрытия контроллера контактов.
Можно надеяться, что Apple исправит это