Составление электронной почты в контроллере swift Nil Modelview

#ios #swift

Вопрос:

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

Спасибо

 func sendEmail(dateString: String, path: URL, hr_path: URL) {
    
    let composeVC = MFMailComposeViewController()
    composeVC.mailComposeDelegate = self
    
    composeVC.navigationBar.tintColor  = .white
    composeVC.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
    
    // Configure email
    // composeVC.setToRecipients(["your@email.here"])
    composeVC.setSubject("Sleep event data for "   dateString)
    composeVC.setMessageBody("Sleep event data attached as CSV", isHTML: false)
    
    if let fileData = NSData(contentsOf: path) {
        print("Motion data loaded.")
        composeVC.addAttachmentData(fileData as Data, mimeType: "text/csv", fileName: "motion_data.csv")
    }
    if let fileData = NSData(contentsOf: hr_path) {
        print("HR data loaded.")
        composeVC.addAttachmentData(fileData as Data, mimeType: "text/csv", fileName: "hr_data.csv")
    }
    
    // Present mail controller
    self.present(composeVC, animated: true, completion: nil)
    
}

func mailComposeController(_ controller: MFMailComposeViewController,
                           didFinishWith result: MFMailComposeResult, error: Error?) {
    
    controller.dismiss(animated: true, completion: nil)
}
 

Снимок Экрана

Ответ №1:

Как вы называете отправку почты ? Это именно та ошибка, о которой написано в сс. Предупреждение о главном потоке :). Вы должны вызвать функцию отправки почты в главном потоке, как показано ниже.

 DispatchQueue.main.async { [weak self] in
    self?.sendEmail(dateString: "sample", path: "URL", hr_path: "URL")
}
 

Ответ №2:

Возможно, ваша sendEmail() функция была вызвана в каком-то фоновом потоке.

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

Итак, в этом случае, поскольку инициализация контроллера представления находится внутри sendEmail() , вам нужно вызвать sendEmail() основной поток, например:

 DispatchQueue.main.async { [weak self] in
    guard let `self` = self else { return }
    self.sendEmail(dateString: "7/7/2021", path: "myPath", hr_path: "hrPath")
}