Цвет панели навигации CNContactViewController не работает должным образом

Цвет панели навигации CNContactViewController не отображается, когда я нажимаю параметр Создать новый контакт. Посмотрите мои экраны в первый раз, все в порядке, но когда я нажимаю Создать новый контакт, я не получаю цвет панели навигации и не вижу кнопку «Назад».

1-й экран

введите здесь описание изображения

2-й экран

введите здесь описание изображения

В старых версиях

введите здесь описание изображения

Мой код

if #available(iOS 9.0, *) {
        let store = CNContactStore()
        let contact = CNMutableContact()
        let homePhone = CNLabeledValue(label: CNLabelHome, value: CNPhoneNumber(stringValue : self.mobile ?? ""))
        contact.phoneNumbers = [homePhone]
        let controller = CNContactViewController(forUnknownContact : contact)
        controller.contactStore = store
        controller.delegate = self

        if #available(iOS 10.0, *) {
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(0.1 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: {
                //Set status bar background colour
                let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
                statusBar?.backgroundColor = UIColor.red
                //Set navigation bar subView background colour
                for view in controller.navigationController?.navigationBar.subviews ?? [] {
                    view.tintColor = UIColor.white
                    view.backgroundColor = UIColor.red
                }
            })
        }

        navigationController?.pushViewController(controller, animated: true)
    }

И еще один номер телефона по умолчанию: (913) 351-5518


person iOS    schedule 24.04.2019    source источник
comment
Вы используете панель навигации по умолчанию или пользовательскую? Пользовательские средства с цветом фона UIView и пользовательской кнопкой «Назад».   -  person sn86    schedule 24.04.2019
comment
Для этого я использую пользовательскую навигацию View, см. this. для просмотра в controller.navigationController?.navigationBar.subviews ?? [] {   -  person iOS    schedule 24.04.2019
comment
@ shahnilay86, из-за того, что в iOS 10 и более поздних версиях панель навигации CNContactViewController не отображается по умолчанию.   -  person iOS    schedule 24.04.2019
comment
@ shahnilay86, эта проблема возникает только начиная с iOS 10. В iOS 9.0 работает нормально.   -  person iOS    schedule 24.04.2019
comment
Дали ли вы соответствующее ограничение панели навигации? Вроде Высота..   -  person sn86    schedule 24.04.2019
comment
@ shahnilay86, посмотри этот код, я здесь не упоминаю кадр. Непосредственно я назначил subViews. //Установить цвет фона subView панели навигации для представления в controller.navigationController?.navigationBar.subviews ?? [] { view.tintColor = UIColor.white view.backgroundColor = UIColor.red }   -  person iOS    schedule 24.04.2019


Ответы (1)


Я бы предложил отобразить CNConctactViewController в UINavigationController в стиле Popover Modal Presentation и добавить несколько кнопок для возврата в основное приложение. Эта реализация кажется нетривиальной, как сообщают слухи в сети.

Позвольте мне поделиться несколькими фрагментами моего кода (swift 5).

Основной класс:

class MyViewController: UITableViewController, UIPopoverPresentationControllerDelegate {

   var contactViewController = CNContactViewController()
   ...
   @objc func dismissContactViewController() {
      contactViewController.dismiss(animated: true, completion: nil)
   }
}

Расширение:

extension MyViewController: CNContactViewControllerDelegate {

func openCNContactViewController(willAppearWith: CNContact, type: ContactType) {
    switch type {
    case .forContact:
        contactViewController = CNContactViewController(for: willAppearWith)
        contactViewController.allowsEditing = false
        break
    case .forNewContact:
        contactViewController = CNContactViewController(forNewContact: willAppearWith)
        contactViewController.allowsEditing = true
        break
    case .forUnknowContact:
        contactViewController = CNContactViewController(forUnknownContact: willAppearWith)
        contactViewController.allowsEditing = true
        break
    }
    contactViewController.allowsActions = true
    contactViewController.contactStore = globalContactStore
    contactViewController.hidesBottomBarWhenPushed = true
    contactViewController.delegate = self
    // define the button (or select a default one)
    let button = UIButton(type: .custom)
    button.setTitleColor(self.view.tintColor, for: .normal)
    button.setTitle("My app name", for: .normal)
    button.addTarget(self, action: #selector(dismissContactViewController), for: .touchUpInside)
    let closeButton = UIBarButtonItem(customView: button)
    closeButton.style = .plain

    // add flexible space
    let flexibleSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: nil, action: nil)

    // add to toolbar
    contactViewController.setToolbarItems([flexibleSpace, closeButton, flexibleSpace], animated: false)

    let navigationVC = UINavigationController(rootViewController: contactViewController)

    // show toolbar
    navigationVC.setToolbarHidden(false, animated: false)

    // set navigation presentation style
    navigationVC.modalPresentationStyle = .popover

    // present view controller
    self.present(navigationVC, animated: true, completion: nil)
 }

Результат введите здесь описание изображения

person Giuseppe Beccari    schedule 01.05.2020