从加载它的ViewController中调用详细的PageViewController中的函数

问题描述 投票:0回答:1

我有一个加载不同相册的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:致命错误:在解开Optional值时意外发现nil

有没有办法添加这个功能?或者有一种更简单的方式来存档吗?谢谢!

ios iphone uipageviewcontroller
1个回答
0
投票

我建议您设置相册视图控制器以获得委托属性。

定义实现saveToAlbum方法的协议ParentProtocol。

让你ItemController符合该协议。

在页面视图控制器中,在加载页面时,将其委托属性设置为self。

在“影集”视图控制器中,在“影集”视图控制器中创建一个IBAction方法,该方法将saveToAlbum方法发送给委托。

这是一种非常常见的模式,用于将消息从子视图控制器转发到父视图。

我最近在Github上创建了一个名为TabBarControllers的项目,该项目与标签栏控制器非常相似(标签栏控制器管理2个或更多子视图控制器作为标签。)在这种情况下,子视图控制器在启动时从故事板加载Segue公司。在您的情况下,您将不得不编写代码来设置代理,因为它加载了专辑视图控制器,但这个想法非常相似。

© www.soinside.com 2019 - 2024. All rights reserved.