Ein großes Lob an @GxocT für die großartige Problemumgehung! Hat meinen Nutzern sehr geholfen.
Aber ich wollte meinen Code basierend auf der @ GxocT-Lösung teilen, in der Hoffnung, dass er anderen in diesem Szenario hilft.
Ich musste CNContactViewControllerDelegate contactViewController(_:didCompleteWith:)beim Abbrechen angerufen werden (und auch erledigt).
Auch mein Code war nicht in einem UIViewControllerso gibt es keinself.navigationController
Ich mag es auch nicht, Gewalt auszuwickeln, wenn ich helfen kann. Ich wurde in der Vergangenheit gebissen, also habe ich if lets im Setup angekettet
Folgendes habe ich getan:
Erweitern CNContactViewControllerund platzieren Sie die Swizzle-Funktion
dort.
In meinem Fall in der Swizzle-Funktion rufen Sie einfach den
CNContactViewControllerDelegateDelegaten
contactViewController(_:didCompleteWith:)mit selfund
self.contactObjekt vom Kontakt-Controller auf
Stellen Sie im Setup-Code sicher, dass der Aufruf von swizzleMethod
class_getInstanceMethoddie CNContactViewController
Klasse anstelle von angibtself
Und der Swift-Code:
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)
}
}
Die Tastatur wird weiterhin kurz angezeigt, fällt jedoch unmittelbar nach dem Schließen des Kontakt-Controllers ab.
Hoffen wir, dass Apple das behebt