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 UIViewControllernê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 lettrong thiết lập
Đây là những gì tôi đã làm:
Mở rộng CNContactViewControllervà đặ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 selfvà
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_getInstanceMethodchỉ đị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