Невозможно отклонить CNContactViewController

Я пытаюсь позволить пользователю создать новый контакт. Несмотря на то, что у меня есть экран, чтобы предложить пользователю ввести все свои данные, вверху нет панели навигации (как в стандартном приложении Apple Contacts). Нет возможности покинуть сцену. Я использую фреймворк ContactUI в Swift 2.0 и Xcode 7.3. Вот код:

// create a new contact
    let createNewActionHandler = {(action: UIAlertAction) -> Void in
        let newContact = CNMutableContact()

        let contactPicker = CNContactViewController(forNewContact: newContact)
        contactPicker.delegate = self
        contactPicker.navigationController?.setToolbarHidden(false, animated: false)
        self.presentViewController(contactPicker, animated: true, completion: nil)

    }

Вот что я пытаюсь получить: Apple Default

Вот что у меня есть: что у меня есть

Я запускаю новый контроллер представления контактов с листа действий в контроллере представления вкладок. Я попытался встроить вкладку в контроллер вида навигации, но безрезультатно. Я даже пытался установить свойство setToolbarHidden для navController, но это не помогло.

Спасибо за любую помощь. Я видел проблему, поднятую на других форумах, но они не помогли.

4 ответа

Решение

Контроллеры представления должны быть встроены в UINavigationController, и вы должны нажать или показать контроллер представления:

navigationController?.pushViewController(contactPicker, animated: true)

вместо представления контроллера представления

Вы должны встроить contactViewController в UINavigationController и реализовать методы делегата.

let createNewActionHandler = {(action: UIAlertAction) -> Void in
    let newContact = CNMutableContact()

    let contactPicker = CNContactViewController(forNewContact: newContact)
    contactPicker.delegate = self
    let navigation = UINavigationController(rootViewController: contactPicker)
    self.presentViewController(navigation, animated: true, completion: nil)

}


//MARK: - Delegate

  func contactViewController(viewController: CNContactViewController, didCompleteWithContact contact: CNContact?) {
      viewController.dismissViewControllerAnimated(true, completion: nil)
  }

  func contactViewController(viewController: CNContactViewController, shouldPerformDefaultActionForContactProperty property: CNContactProperty) -> Bool {
      return true
  }

Поскольку вы представляете viewcontroller contactPicker поверх текущего активного контроллера, у вас не будет доступа к панели навигации, поскольку представление представлено полностью, если вы хотите, чтобы кнопки были такими же, как в приложении контактов Apple, вам нужно встроить представляемый viewcontroller в UINavigationController и добавить элементы кнопок левой и правой панели.

Обратитесь к следующему образцу яблока, который демонстрирует то же самое. https://developer.apple.com/library/ios/samplecode/iPhoneCoreDataRecipes/Listings/Classes_RecipeAddViewController_m.html

Я пробовал все методы, но ни один из них не работал, поэтому я сделал собственный метод

      extension UIBarButtonItem {
private struct AssociatedObject {
    static var key = "action_closure_key"
}

var actionClosure: (()->Void)? {
    get {
        return objc_getAssociatedObject(self, &AssociatedObject.key) as? ()->Void
    }
    set {
        objc_setAssociatedObject(self, &AssociatedObject.key, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        target = self
        action = #selector(didTapButton(sender:))
    }
}

@objc func didTapButton(sender: Any) {
    actionClosure?()
}
}
extension UIViewController{
func addDissmissButton(){
    let cancelButton = UIBarButtonItem.init(title: "Dismiss", style: .plain, target: self, action: nil)
    cancelButton.actionClosure = {
        self.dismiss(animated: true)
    }
    self.navigationItem.leftBarButtonItem = cancelButton
}}

 DispatchQueue.main.async {
                let contactvc = CNContactViewController(for: contact)
                contactvc.contactStore = self.store
                contactvc.delegate = self
                contactvc.addDissmissButton()
                let navigationController = UINavigationController(rootViewController: contactvc)
                self.present(navigationController, animated: false)
            }
Другие вопросы по тегам