Невозможно отклонить 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)
}