Swift使用SMTP发送UITableView选中PDF对应URL的实现问题
功能实现方案
第一步:修复选中PDF的收集逻辑
你现有代码里的selectdeselectcell方法每次选中都会清空selectedPdf数组,完全无法保存选中项,修改为以下逻辑:
func selectdeselectcell(tableview : UITableView ,indexpath : IndexPath){ guard pdfListView.isEditing else { return } // 清空旧的选中数据后重新收集所有选中项 selectedPdf.removeAll() if let selectedIndexPaths = pdfListView.indexPathsForSelectedRows { for indexPath in selectedIndexPaths { let pdfItem: pdfClass if searching { pdfItem = searchall[indexPath.row] } else { pdfItem = pdfList[indexPath.row] } selectedPdf.append(pdfItem) } } }
第二步:添加邮件发送触发入口
修改编辑按钮的点击逻辑,退出编辑模式时如果有选中的PDF,弹出邮箱输入框,确认后触发发送:
@objc func showEditing(_ sender: UIBarButtonItem) { if(self.pdfListView.isEditing == true) { self.pdfListView.isEditing = false self.navigationItem.rightBarButtonItem?.title = "Edit" // 退出编辑时判断是否有选中项,有则弹出收件邮箱输入弹窗 if !selectedPdf.isEmpty { let alert = UIAlertController(title: "发送PDF链接", message: "请输入收件邮箱地址", preferredStyle: .alert) alert.addTextField { textField in textField.placeholder = "收件邮箱" textField.keyboardType = .emailAddress } alert.addAction(UIAlertAction(title: "取消", style: .cancel)) alert.addAction(UIAlertAction(title: "发送", style: .default, handler: { _ in guard let toEmail = alert.textFields?.first?.text, !toEmail.isEmpty else { return } self.sendEmail(to: toEmail, selectedPdfs: self.selectedPdf) })) present(alert, animated: true) } } else { self.pdfListView.allowsMultipleSelectionDuringEditing = true self.pdfListView.isEditing = true self.navigationItem.rightBarButtonItem?.title = "Done" // 进入编辑模式时清空之前的选中项 selectedPdf.removeAll() } }
第三步:修改邮件发送方法,动态生成邮件内容
把原来写死的sendEmail方法改成可传入收件邮箱和选中PDF列表的形式,拼接所有PDF的名称和链接到邮件正文:
func sendEmail(to toEmail: String, selectedPdfs: [pdfClass]) { let message = SKPSMTPMessage() message.relayHost = "smtp.gmail.com" message.login = "你的发件邮箱@gmail.com" // 注意:Gmail现在不支持直接用账号密码登录,需要去谷歌账号后台生成应用专用密码 message.pass = "你的应用专用密码" message.requiresAuth = true message.wantsSecure = true message.relayPorts = [587] message.fromEmail = "你的发件邮箱@gmail.com" message.toEmail = toEmail message.subject = "你选择的PDF资源链接" // 拼接邮件正文 var emailContent = "以下是你选择的PDF资源访问链接:\n\n" for (index, pdf) in selectedPdfs.enumerated() { emailContent += "\(index+1). \(pdf.pdf_name ?? "未命名PDF"):\n\(pdf.pdf_url)\n\n" } emailContent += "点击链接即可直接访问下载对应PDF资源。" let messagePart = [kSKPSMTPPartContentTypeKey: "text/plain; charset=UTF-8", kSKPSMTPPartMessageKey: emailContent] message.parts = [messagePart] message.delegate = self message.send() }
额外调整
删除viewDidLoad里默认调用的sendEmail()代码,原有默认调用无实际业务意义,还会造成不必要的请求。
可以在messageSent和messageFailed代理方法里添加弹窗提示,告知用户邮件发送结果,提升使用体验。
内容的提问来源于stack exchange,提问作者aig_88
相关产品推荐
相关产品推荐

