Kudos to @GxocT untuk solusi hebatnya! Sangat membantu pengguna saya.
Tapi saya ingin membagikan kode saya berdasarkan solusi @GxocT dengan harapan itu akan membantu orang lain dalam skenario ini.
Saya perlu saya CNContactViewControllerDelegate
contactViewController(_:didCompleteWith:)
dipanggil batal (dan juga dilakukan).
Juga kode saya tidak dalam UIViewController
sehingga tidak adaself.navigationController
Saya juga tidak suka menggunakan kekuatan membuka ketika saya bisa membantu. Saya telah digigit di masa lalu jadi saya dirantai if let
di setup
Inilah yang saya lakukan:
Perpanjang CNContactViewController
dan letakkan fungsi swizzle di
sana.
Dalam kasus saya dalam fungsi swizzle panggil saja
CNContactViewControllerDelegate
delegasi
contactViewController(_:didCompleteWith:)
dengan self
dan
self.contact
objek dari pengontrol kontak
Dalam kode pengaturan, pastikan panggilan swizzleMethod untuk
class_getInstanceMethod
menentukan CNContactViewController
kelas, bukanself
Dan kode 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)
}
}
Keyboard masih muncul sesaat tetapi turun tepat setelah pengontrol Kontak ditolak.
Mari berharap apel memperbaikinya