Kudos gửi @GxocT cho cách giải quyết tuyệt vời! Đã giúp người dùng của tôi rất nhiều.
Nhưng tôi muốn chia sẻ mã của mình dựa trên giải pháp @GxocT với hy vọng nó sẽ giúp những người khác trong kịch bản này.
Tôi cần CNContactViewControllerDelegate
contactViewController(_:didCompleteWith:)
được gọi để hủy bỏ (cũng như được thực hiện).
Ngoài ra mã của tôi không ở trong UIViewController
nên không cóself.navigationController
Tôi cũng không thích sử dụng vũ lực khi tôi có thể giúp nó. Tôi đã bị cắn trong quá khứ vì vậy tôi đã xiềng xích if let
trong thiết lập
Đây là những gì tôi đã làm:
Mở rộng CNContactViewController
và đặt chức năng swizzle trong
đó.
Trong trường hợp của tôi trong hàm sự gian lận chỉ cần gọi các
CNContactViewControllerDelegate
đại biểu
contactViewController(_:didCompleteWith:)
với self
và
self.contact
đối tượng từ bộ điều khiển liên lạc
Trong mã thiết lập, đảm bảo lệnh gọi swizzleMethod để
class_getInstanceMethod
chỉ định CNContactViewController
lớp thay vìself
Và mã 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)
}
}
Bàn phím vẫn hiển thị trong giây lát nhưng giảm xuống ngay sau khi bộ điều khiển Danh bạ tắt.
Hãy hy vọng táo sửa lỗi này