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

Call a function in a detail PageViewController from the ViewController that loads it

我有一个加载不同相册的页面ViewController,每个相册都是从不同的视图控制器加载的(album1ViewController...album3ViewController),如图所示以下。 Storyboard

每个视图控制器(album1...album3)都是从导航视图控制器加载的,因此它们加载了一个导航栏。我想在导航栏上添加一个保存到相机胶卷按钮,所以我将这段代码放在 ItemVC(加载图像的那个)和 PageViewController 中,但它没有激活保存按钮:

navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Save", style: .plain, target: self, action: #selector(saveToCameraRoll))

所以我认为以编程方式添加按钮的唯一方法是在 albumsVC 中。 (我尝试在 ItemsVC 的故事板中添加栏,但它没有正确显示)。但是现在我想在 album#ViewController 调用的按钮中使用 ItemsViewController 中的图像调用函数 SaveToCameraRoll。我首先尝试将函数留在 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))

但是应用程序崩溃了。出现此错误:

unrecognized selector sent to instance 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!)

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

有没有办法添加这个功能?还是有更简单的方法来归档这个? 谢谢!

我建议将您的相册视图控制器设置为具有委托 属性。

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

让你ItemController遵守那个协议。

在您的页面视图控制器中,当您加载页面时,将它们的委托 属性 设置为 self。

在您的相册视图控制器中,在相册视图控制器中创建一个 IBAction 方法,该方法将 saveToAlbum 方法发送给委托。

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

我最近在 Github 上创建了一个名为 TabBarControllers 的项目,它的功能与选项卡栏控制器非常相似(一个选项卡栏控制器将 2 个或更多子视图控制器作为选项卡进行管理。)在那种情况下子视图控制器在启动时通过 segue 从故事板加载。在您的情况下,您必须编写代码来设置委托,因为它加载相册视图控制器,但想法非常相似。