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 UIViewController
so 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 let
s im Setup angekettet
Folgendes habe ich getan:
Erweitern CNContactViewController
und platzieren Sie die Swizzle-Funktion
dort.
In meinem Fall in der Swizzle-Funktion rufen Sie einfach den
CNContactViewControllerDelegate
Delegaten
contactViewController(_:didCompleteWith:)
mit self
und
self.contact
Objekt vom Kontakt-Controller auf
Stellen Sie im Setup-Code sicher, dass der Aufruf von swizzleMethod
class_getInstanceMethod
die 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