Кудо до @GxocT за чудове рішення! Дуже допомагав моїм користувачам.
Але я хотів поділитися своїм кодом на основі рішення @GxocT, сподіваючись, що він допоможе іншим у цьому сценарії.
Мені потрібно було, CNContactViewControllerDelegate
contactViewController(_:didCompleteWith:)
щоб мене викликали при скасуванні (як і зроблено).
Також мого коду не було, UIViewController
так що немаєself.navigationController
Мені також не подобається використовувати силу розгортання, коли я можу допомогти. Мене покусали в минулому, тому я прикував if let
до себе налаштування
Ось що я зробив:
Розкладіть CNContactViewController
і помістіть туди функцію swizzle
.
У моєму випадку у функції Swizzle просто викличте
CNContactViewControllerDelegate
делегат
contactViewController(_:didCompleteWith:)
з self
і
self.contact
об'єкт з контакту контролера
У коді установки переконайтеся, що виклик swizzleMethod
class_getInstanceMethod
вказує CNContactViewController
клас замістьself
І код Свіфта:
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)
}
}
Клавіатура все ще на мить відображається, але опускається відразу після відключення контролера "Контакти".
Сподіваємось, яблуко це виправить