Swift 取消 ActivityViewController 会导致致命错误

Posted

技术标签:

【中文标题】Swift 取消 ActivityViewController 会导致致命错误【英文标题】:Swift Cancelling the ActivityViewController causes fatal error 【发布时间】:2015-06-21 16:48:54 【问题描述】:

好的,所以我的 ActivityViewController 在正常共享时可以正常工作,但是每当用户在调用 ActivityViewController 后点击取消时,我就会收到烦人的致命错误。

fatal error: unexpectedly found nil while unwrapping an Optional value

所以看起来我没有很好地解开我的选项。这是分享方法:

@IBAction func share(sender: UIBarButtonItem) 
        var   memeedimage = generateMemedImage()


        let activityViewController = UIActivityViewController(activityItems:[memeedimage] , applicationActivities: nil)
        presentViewController(activityViewController, animated: true, completion: nil)


        activityViewController.completionWithItemsHandler = 
            (activity, success, returneditems, error) in
            println("Activity: \(activity) Success: \(success) Items: \(returneditems) Error: \(error)")
            self.save()

            activityViewController.dismissViewControllerAnimated(true, completion:
                let memevc:MemeTableViewController  = MemeTableViewController()
                self.presentViewController(memevc, animated: true, completion: nil)
                )
        

并且 share 方法调用 save 函数,该函数使用隐式展开的可选项生成名为 meme 的对象,这会导致错误:

func save()
        var meme : MemeObject!

          meme = MemeObject(textFieldtop : texfieldtop.text! ,textFieldbottom : textfieldbottom.text!  ,image : imagePickerView.image! , memedImage : generateMemedImage())
            (UIApplication.sharedApplication().delegate as! AppDelegate).memes.append(meme!)

    

所以我决定安全地解开 meme 可选值,但这又引发了另一个问题

 func save()
        var meme : MemeObject?
        if let memez = meme
          meme = MemeObject(textFieldtop : texfieldtop.text! ,textFieldbottom : textfieldbottom.text!  ,image : imagePickerView.image! , memedImage : generateMemedImage())
            (UIApplication.sharedApplication().delegate as! AppDelegate).memes.append(meme!)
        

        else
            println("Optionals man")
        

    

现在,当对象不是 nil 时,会打印不应该发生的“Optionals man”,并且 share 方法中的 completionwithitemshandler 属性没有显示应该在用户共享对象后直接发生的表视图控制器。

MemeTableViewController 的代码:

import UIKit

class MemeTableViewController : UIViewController,UITableViewDelegate,UITableViewDataSource

    var memesz: [MemeObject]!


    @IBOutlet var tableView: UITableView!



    override func viewWillAppear(animated: Bool) 

            super.viewWillAppear(animated)
            let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
            memesz = appDelegate.memes
            //tableView.reloadData()


    

    override func viewDidLoad() 


        super.viewDidLoad()
        navigationController?.hidesBarsOnSwipe = true
        navigationController?.hidesBarsOnTap = true

    

    //reserves the number of rows needed to display the image
       func tableView(tableView : UITableView, numberOfRowsInSection section : Int)->Int
       

            return memesz.count

        
    //Reserves the row to be dequeued for display
     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

        let cell:TableViewzCell = tableView.dequeueReusableCellWithIdentifier("MemesCell", forIndexPath: indexPath) as! TableViewzCell
        let memezrow =  memesz[indexPath.row]
        cell.label1.text = memezrow.textFieldtop
        cell.label2.text = memezrow.textFieldbottom
        cell.imageview.image = memezrow.memedImage

            return cell
    

    //Method to do something when the row is selected
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

        let detailController = self.storyboard!.instantiateViewControllerWithIdentifier("FullScreenMeme") as! FullScreenMeme
        detailController.meme = memesz[indexPath.row]
        self.navigationController!.pushViewController(detailController, animated: true)

    


有什么帮助吗?

【问题讨论】:

【参考方案1】:

查看您的代码后,您似乎还没有初始化变量“meme”。

func save()
        var meme : MemeObject? =  MemeObject(textFieldtop : texfieldtop.text! ,textFieldbottom : textfieldbottom.text!  ,image : imagePickerView.image! , memedImage : generateMemedImage())

        if let memez = meme
            (UIApplication.sharedApplication().delegate as! AppDelegate).memes.append(meme!)
        

        else
            println("Optionals man")
        

    


@IBAction func share(sender: UIBarButtonItem) 
var   memeedimage = generateMemedImage()


let activityViewController = UIActivityViewController(activityItems:[memeedimage] , applicationActivities: nil)
presentViewController(activityViewController, animated: true, completion: nil)


activityViewController.completionWithItemsHandler = 
    (activity, success, returneditems, error) in
    println("Activity: \(activity) Success: \(success) Items: \(returneditems) Error: \(error)")
    self.save()

    let memevc  = self.storyboard!.instantiateViewControllerWithIdentifier("MemeTableViewConroller") as! MemeTableViewController

    self.presentViewController(memevc, animated: true, completion: nil)


【讨论】:

表视图控制器在初始化 'meme' 后仍然没有被调用。想知道为什么? 你不需要调用activityViewController.dismissViewControllerAnimated。我已经编辑了我的答案。请看一下。 好的,现在我认为 ActivityViewController 已经调用了 TableViewController 但是在它被调用后我得到了一个完整的黑屏。 我不知道 MemeTableViewController 是如何实现的,但是你应该调用正确的初始化器。包括 MemeTableViewController 的初始化程序来帮助你。请接受我的正确回答。 我已经更新了我的问题。请我真的需要完成这个项目。 MemeTableViewController 应该从应用程序委托中的数组中获取保存的对象并显示它们。

以上是关于Swift 取消 ActivityViewController 会导致致命错误的主要内容,如果未能解决你的问题,请参考以下文章

Swift 取消 ActivityViewController 会导致致命错误

在 swift 中使用 Alamofire 取消 api 请求

Swift 2.0 - UISearchBar 取消按钮不删除 searchBar 内容

Swift:如何取消延迟的 pushViewController?

Swift:searchBar - 如何更改“取消”按钮标题

Swift:searchBar - 如何更改“取消”按钮标题