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?