Таблица действий наложения клавиатуры в iOS 13.1 на CNContactViewController - PullRequest
5 голосов
/ 01 октября 2019

Это, кажется, характерно для iOS 13.1, так как он работает как ожидается на iOS 13.0 и более ранних версиях для добавления контакта в CNContactViewController, если я «Отмена», лист действий перекрывается клавиатурой. Никакие действия не выполняются и клавиатура не закрывается.

Ответы [ 4 ]

2 голосов
/ 04 октября 2019

Спасибо @GxocT за отличный обходной путь! Очень помог моим пользователям.
Но я хотел поделиться своим кодом на основе решения @GxocT, надеясь, что это поможет другим в этом сценарии.

Мне нужно, чтобы мой CNContactViewControllerDelegate contactViewController(_:didCompleteWith:) вызывался при отмене (так же как и сделано).

Также мой код не был в UIViewController, поэтому нет self.navigationController

Мне также не нравится использовать принудительные развёртки, когда я могу помочь. Я был укушен в прошлом, поэтому я приковал if let s в настройке

Вот что я сделал:

  1. Расширение CNContactViewControllerи поместите функцию Swizzle в
    там.

  2. В моем случае в функции swizzle просто вызовите
    CNContactViewControllerDelegate делегата
    contactViewController(_:didCompleteWith:) с self и
    self.contact объектом из контактаконтроллер

  3. В коде настройки убедитесь, что вызов swizzleMethod для class_getInstanceMethod указывает класс CNContactViewController вместо self

И код 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)
    }
}

Клавиатура по-прежнему отображается на мгновение, но падает сразу после закрытия контроллера контактов.
Можно надеяться, что Apple исправит это

2 голосов
/ 13 октября 2019

Пользователь может провести пальцем вниз, чтобы закрыть клавиатуру, а затем нажать Отмена и просмотреть лист действий. Так что эта проблема вызывает сожаление и определенно является ошибкой (и я подал отчет об ошибке), но не является фатальной (хотя, конечно, обходной путь не прост для обнаружения пользователем).

enter image description here

2 голосов
/ 03 октября 2019

Я не мог найти способ отклонить клавиатуру. Но, по крайней мере, вы можете открыть ViewController, используя мой метод.

  1. Не знаю почему, но нельзя отрицать клавиатуру в CNContactViewController. Я попытался endEditing:, сделать новый UITextField firstResponder и так далее. Ничего не помогло.
  2. Я пытался изменить действие для кнопки "Отмена". Вы можете найти эту кнопку в стеке NavigationController, но ее действие меняется каждый раз, когда вы что-то печатаете.
  3. Наконец я использовал метод swizzling. Я не мог найти способ отклонить клавиатуру, как я упоминал ранее, но по крайней мере вы можете отклонить CNContactViewController, когда нажата кнопка «Отмена».
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        changeImplementation()
    }

    @IBAction func userPressedButton(_ sender: Any) {
        let controller = CNContactViewController(forNewContact: nil)
        controller.delegate = self
        navigationController?.pushViewController(controller, animated: true)
    }

    @objc func popController() {
        self.navigationController?.popViewController(animated: true)
    }

    func changeImplementation() {
        let originalSelector = Selector("editCancel:")
        let swizzledSelector = #selector(self.popController)

        if let originalMethod = class_getInstanceMethod(object_getClass(CNContactViewController()), originalSelector),
            let swizzledMethod = class_getInstanceMethod(object_getClass(CNContactViewController()), swizzledSelector) {

            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

PS: Вы можете найти дополнительную информацию оReddit тема: https://www.reddit.com/r/swift/comments/dc9n3a/bug_with_cnviewcontroller_ios_131/

0 голосов
/ 31 октября 2019

Ребята, вы нашли решение этой проблемы? Apple выпустила iOS 13.2, и все же мы можем воспроизвести эту же вещь.

Кроме того, пользователь reedit @ poutchi87 сказал, что сделал запрос на исправление ошибки в Apple. Если это один из вас, ребята, они отправили какой-нибудь отзыв?

...