Search code examples
swiftuinavigationcontrollercncontactviewcontroller

setup navigation controller View Controller as a CNContactViewController black screen


I have a collection view with some cells representing a contact (their data has a phone number and name) and I am trying to add the contact to the iPhone contacts. I have created a segue from a button called "add contact" that is inside the CollectionViewCell to a navigation controller, and set its identifier as "ADD_CONTACT".
In the storyboard, my segue has a navigation controller with no root view controller. in prepareToSegue of the view controller that delegates my UICollectionView I wrote this code:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == ADD_CONTACT {
        let dest = segue.destination as! UINavigationController
        if let cell = sender as? SBInstructionCell {
            if cell.isContact {
                let newContact = CNMutableContact()

                if let phone = cell.instructionBean?.contactAttachment?.phoneNumber{
                    newContact.phoneNumbers.append(CNLabeledValue(label: "home", value: CNPhoneNumber(stringValue: phone)))
                }
                if let name = cell.instructionBean?.contactAttachment?.contactName {
                    newContact.givenName.append(name)
                }
                let contactVC = CNContactViewController(forNewContact: newContact)
                contactVC.contactStore = CNContactStore()
                contactVC.delegate = self
                dest.setViewControllers([contactVC], animated: false)

            }
        }
    }
}

this results with a black screen. How can this be fixed? I want to see the CNContactViewController


Solution

  • Eventually I solved this in a different approach using Closures.

    In my UICollectionViewCell I added this var:

        var closureForContact: (()->())? = nil
    

    Now on my button's action in the same cell I have this func:

        @IBAction func addContactTapped(_ sender: UIButton) {
        if closureForContact != nil{
            closureForContact!()
        }
        }
    

    Which calls the function.

    In my CollectionView in cell for item at index path, I set the closure like this:

                        cell.closureForContact = {
    
                            if cell.isContact {
                                let newContact = CNMutableContact()
    
                                if let phone = cell.instructionBean?.contactAttachment?.phoneNumber{
                                    newContact.phoneNumbers.append(CNLabeledValue(label: "home", value: CNPhoneNumber(stringValue: phone)))
                                }
                                if let name = cell.instructionBean?.contactAttachment?.contactName {
                                    newContact.givenName.append(name)
                                }
                                let contactVC = CNContactViewController(forNewContact: newContact)
                                contactVC.contactStore = CNContactStore()
    
                                contactVC.delegate = self
                                contactVC.allowsEditing = true
                                contactVC.allowsActions = true
    
                                if let nav = self.navigationController {
                                    nav.navigationBar.isTranslucent = false
    
                                    nav.pushViewController(contactVC, animated: true)
                                }
                            }
                        }
    

    This worked perfectly. I learned that for navigating from a cell, it is best to use closures.