Swift 2:电子邮件取消按钮在第二次尝试表视图后停止工作

Posted

技术标签:

【中文标题】Swift 2:电子邮件取消按钮在第二次尝试表视图后停止工作【英文标题】:Swift 2: Email Cancel Button Stops Working After Second Try on a Table View 【发布时间】:2016-01-06 23:39:12 【问题描述】:

我正在使用一个表格视图,其中包含一个显示“向我们发送反馈”的单元格。它打开电子邮件应用程序,其中包含要发送的预设信息。我可以发送电子邮件和/或取消它,但是当我第一次取消它时,停留在表格视图上,再次点击单元格以打开电子邮件,我无法再次取消它。它只是停留在电子邮件视图上。

建议?

我的代码如下:

import UIKit
import MessageUI

class FeedbackViewController: UITableViewController, MFMailComposeViewControllerDelegate 

    let mailComposerVC = MFMailComposeViewController()

    override func viewDidLoad() 
        super.viewDidLoad()

        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem()
    

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

        if indexPath.section == 0 && indexPath.row == 0
        
            let alertController = UIAlertController(title: "Rate Us", message: "\nAre you enjoying our app? Please rate us in the app store!\n\nElse if you know of ways we can make our app better, please send us feedback so we can improve the experience for you!\n\nThank you!\n\nTimmy Caish", preferredStyle: .Alert)

            alertController.addAction(UIAlertAction(title: "Rate on iTunes", style: .Default, handler: 
                (action: UIAlertAction!) -> Void in
                UIApplication.sharedApplication().openURL((NSURL(string: "http://google.com")!))
                print("Rate us alert button worked.")
                print("Send to iTunes")
            ))

            alertController.addAction(UIAlertAction(title: "Send Us Feedback", style: .Default, handler: 
                (action: UIAlertAction!) in
                print("Rate Us feeback button worked.")
                let mailComposeViewController = self.configureMailComposeViewController()
                if MFMailComposeViewController.canSendMail()
                
                    self.presentViewController(mailComposeViewController, animated: true, completion: nil)
                
                else
                
                    self.showSendMailErrorAlert()
                
            ))

            alertController.addAction(UIAlertAction(title: "Cancel", style: .Default, handler:  (action: UIAlertAction) in
                print("Rate us cancel button worked.")
            print("Rate us")
            ))

            presentViewController(alertController, animated: true, completion: nil)
        


        if indexPath.section == 0 && indexPath.row == 1
        
            let mailComposeViewController = configureMailComposeViewController()

            if MFMailComposeViewController.canSendMail()
            
                self.presentViewController(mailComposeViewController, animated: true, completion: nil)
            
            else
            
                self.showSendMailErrorAlert()
            

            print("Send us feedback")
        

    

    func configureMailComposeViewController() -> MFMailComposeViewController 

        mailComposerVC.mailComposeDelegate = self

        mailComposerVC.setToRecipients(["developer.timmy@gmail.com"])
        mailComposerVC.setSubject("Weather Simplicity Feedback")
        mailComposerVC.setMessageBody("Hello,\n\nI would like to share the following feedback...\n\n", ishtml: false)

        return mailComposerVC

    

    func showSendMailErrorAlert() 

        let sendMailErrorAlert = UIAlertController(title: "Error", message: "Your device could not send the email. Check your email configurations and try again.", preferredStyle: UIAlertControllerStyle.Alert)
        let okay = UIAlertAction(title: "Okay", style: UIAlertActionStyle.Default, handler: nil)
        sendMailErrorAlert.addAction(okay)
        self.presentViewController(sendMailErrorAlert, animated: true, completion: nil)
    

    func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) 

        switch result 

        case MFMailComposeResultCancelled:
            print("Cancelled mail")
            break
        case MFMailComposeResultSent:
            print("Message sent")
            break
        default:
            break
        

        self.dismissViewControllerAnimated(true, completion: nil)

    


【问题讨论】:

邮件控制器代理是否被第二次调用? 【参考方案1】:

仅当您需要在 didSelectRow 中而不是在创建视图控制器时尝试创建一个新的 mailViewController。这将确保它每次都是干净的,除非需要,否则不会创建它,并且可能会解决第二次取消不起作用的问题。

【讨论】:

以上是关于Swift 2:电子邮件取消按钮在第二次尝试表视图后停止工作的主要内容,如果未能解决你的问题,请参考以下文章

UIView 仅在第二次调用后显示

合并 - 订阅者在第二次订阅时被静默取消

应用程序在第二次选择同一行时崩溃

Swift UIViewController tableView.reloadData nil 在第二次调用时包装

NSUserDefault 同步后退按钮 swift

Swift 5 - 用户第二次单击标签栏按钮后,需要帮助在视图控制器 1 上重新加载 Web 视图