Представление MFMessageComposeViewController/Понимание DispatchQueue.main.async

Я пытаюсь представить MFMessageComposeViewController после того, как человек выберет свои контакты. Но я получаю сообщение об ошибке lldb со следующим сообщением:

*** Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Приложение пыталось модально представить активный контроллер ‹Indexex.PortfolioSettingsViewController: 0x1452000000>».

Вот мой код:

func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]) {
    var recipients = [String]()

    //-- select contacts and present message compose view controller
    contacts.forEach { (contact) in
        for data in contact.phoneNumbers {
            let phoneNo = data.value
            recipients.append(phoneNo.stringValue)
        }

        //-- configure message view controller
        messageViewController.recipients = recipients
        messageViewController.body = "Testing Testing"

        //-- reload the view controller
        DispatchQueue.main.async {
             self.present(self.messageViewController, animated: true, completion: nil)
        }
    }
}

Я действительно не так много понимаю в очереди отправки, поэтому я собираюсь провести больше исследований по этому вопросу и потокам, но если кто-нибудь захочет мне помочь, это будет очень признательно.


person Vandal    schedule 11.07.2018    source источник
comment
Во-первых, отклоните контроллер выбора контактов. Вы можете использовать блок завершения для представления вашего messageViewController.   -  person Mannopson    schedule 11.07.2018
comment
Проблема в том, что вы пытаетесь показать контроллер сообщений для каждого выбранного контакта одновременно. Вы не можете этого сделать. Вы можете показывать только по одному. Вы действительно хотите показать несколько контроллеров сообщений, по одному для каждого контакта, или одно сообщение со всеми контактами?   -  person rmaddy    schedule 11.07.2018
comment
вы пытаетесь представить несколько MFMessageComposeViewController, если хотите один вызов вне цикла for   -  person Anbu.Karthik    schedule 11.07.2018


Ответы (1)


Проблема в том, что вы пытаетесь показать контроллер сообщений для каждого выбранного контакта одновременно. Вы не можете этого сделать. Вы можете показывать только по одному. Вы действительно хотите показать несколько контроллеров сообщений, по одному для каждого контакта, или одно сообщение со всеми контактами?

Поскольку вы пытаетесь представить несколько MFMessageComposeViewController, если вы хотите один вызов вне цикла for, как показано ниже:

contacts.forEach { (contact) in
    for data in contact.phoneNumbers {
        let phoneNo = data.value
        recipients.append(phoneNo.stringValue)
    }
}

//-- configure message view controller
messageViewController.recipients = recipients
messageViewController.body = "Testing Testing"

//-- reload the view controller
DispatchQueue.main.async {
     self.present(self.messageViewController, animated: true, completion: nil)
}
person Vinodh    schedule 11.07.2018