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

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

*** Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина: "Приложение попыталось модально представить активный контроллер ."

Вот мой код:

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)
        }
    }
}

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

1 ответ

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

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

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)
}
Другие вопросы по тегам