我有一个加载不同相册的PageViewController,每个foto相册都是从不同的视图控制器(album1ViewController ... album3ViewController)加载的,如下所示。 Storyboard
从导航视图控制器加载每个视图控制器(album1 ... album3),以便加载导航栏。我想在导航栏中添加一个保存到相机胶卷按钮,所以我把这个代码放在ItemVC(加载图像的那个)和PageViewController中,但它没有激活保存按钮:
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Save", style: .plain, target: self, action: #selector(saveToCameraRoll))
所以我认为以编程方式添加按钮的唯一方法是在albumsVCs中。 (我尝试在ItemsVC的故事板中添加栏,但它没有正确显示)。但是现在我想在专辑#ViewController调用的按钮中调用SaveToCameraRoll函数,并在ItemsViewController中调用该图像。我试过先把这个功能留在ItemsVC中,并尝试从albumVC中调用它,如下所示:
let vc = self.storyboard?.instantiateViewController(withIdentifier: "ItemController") as! ItemViewController
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Guardar en Fotos", style: .plain, target: self, action: #selector(vc.saveToCameraRoll))
但应用程序崩溃了。有这个错误:
无法识别的选择器发送到实例0x7fca05d32e60
然后我尝试在albumVC中添加SaveToCameraRoll函数,如下所示:
@objc func saveToCameraRoll() {
let vc = self.storyboard?.instantiateViewController(withIdentifier: "ItemController") as! ItemViewController
let imageData = UIImagePNGRepresentation(vc.contentImageView.image!)
let compresedImage = UIImage(data: imageData!)
UIImageWriteToSavedPhotosAlbum(compresedImage!, nil, nil, nil)
}
在第二种情况下,我在行中得到错误和崩溃:
let imageData = UIImagePNGRepresentation(vc.contentImageView.image!)
线程1:致命错误:在展开时出乎意料地发现nil 可选值
有没有办法添加这个功能?或者有一种更简单的方式来存档吗? 谢谢!
答案 0 :(得分:0)
我建议您设置相册视图控制器以获得委托属性。
定义实现saveToAlbum方法的协议ParentProtocol。
让ItemController
符合该协议。
在页面视图控制器中,当您加载页面时,将其委托属性设置为self。
在“影集”视图控制器中,在“影集”视图控制器中创建一个IBAction方法,该方法将saveToAlbum方法发送给代理。
这是一种非常常见的模式,用于将消息从子视图控制器转发到父视图。
我最近在Github上创建了一个名为TabBarControllers的项目,它与标签栏控制器非常相似(标签栏控制器管理2个或更多子视图控制器作为标签。)在这种情况下,子视图控制器被加载从启动时的故事板到segue。在您的情况下,您将不得不编写代码来设置代理,因为它加载了专辑视图控制器,但这个想法非常相似。