CNContactViewControllerDelegate не вызывается, когда свойство контакта выбрано / отредактировано на iOS - PullRequest
0 голосов
/ 04 декабря 2018

Делегат для CNContactviewController не вызывается, когда свойства редактируются или выбираются.

При редактировании нового контакта должна вызываться функция contactViewController(_ viewController: CNContactViewController, shouldPerformDefaultActionFor property: CNContactProperty), но это не так.

Как вы получаете уведомление, когда пользователь редактирует / выбирает свойство контакта?

Шаги для воспроизведения:

  1. Скопируйте контроллер вида ниже.
  2. Редактировать / выбрать свойство контакта.

Ожидаемое поведение:

"йо" печатается каждый раз, когда вы редактируете / выбираете свойство.

Фактическое поведение:

Ничего.

import Foundation
import Contacts
import ContactsUI


class ContactViewController: UIViewController, CNContactViewControllerDelegate {


    override func viewDidLoad() {
        super.viewDidLoad()

        createContact()
    }


    func createContact() {
        let contactController = CNContactViewController(forNewContact: nil)

        contactController.delegate = self
        contactController.allowsEditing = true
        contactController.allowsActions = true
        contactController.displayedPropertyKeys = [CNContactPostalAddressesKey, CNContactPhoneNumbersKey, CNContactGivenNameKey]

        contactController.view.layoutIfNeeded()

        present(contactController, animated:true)
    }


    // =============================================================================================================
    // MARK: CNContactViewControllerDelegate Functions
    // =============================================================================================================
    func contactViewController(_ viewController: CNContactViewController, didCompleteWith contact: CNContact?) {
        viewController.dismiss(animated: true, completion: nil)
        print("hi")
    }


    func contactViewController(_ viewController: CNContactViewController, shouldPerformDefaultActionFor property: CNContactProperty) -> Bool {
        print("yo")
        return true
    }


    // =============================================================================================================
    // MARK: UIViewController Functions
    // =============================================================================================================
    override var prefersStatusBarHidden: Bool {
        return true
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

1 Ответ

0 голосов
/ 04 декабря 2018

Существует три инициализатора для создания контроллера CNContactViewController:

  • Существующий контакт: init(for:)
  • Новый контакт: init(forNewContact:)
  • Неизвестный контакт: init(forUnknownContact:)

Первая и третья формы вызывают метод делегата contactViewController(_:shouldPerformDefaultActionFor:).Второй формы нет.Это тот, который вы используете.

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

При редактировании нового контакта функция contactViewController (_ viewController: CNContactViewController, shouldPerformDefaultActionFor: CNContactProperty) должна вызываться

Нет, это не так.Это просто идея, которую вы придумали.

Ожидаемое поведение: «йо» печатается каждый раз, когда вы редактируете / выбираете свойство.

Затем перестаньте ожидать этого.

Как вы получаете уведомление, когда пользователь редактирует / выбирает свойство контакта?

Нет.

Когда вы используете каркас, такой как Cocoa,Вы не можете оправдать ожидания, которые вам нравятся.Ваши ожидания должны основываться на том, что на самом деле делает фреймворк.Вы могли бы пожелать , чтобы CNContactViewController и его сообщения делегата работали так, как вы описали, и это могло бы сделать очень хороший запрос на улучшение для Apple.Но на самом деле это не то, как это работает , поэтому ожидание того, что это так, не принесет вам никакой пользы.

...