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

Posted

技术标签:

【中文标题】从加载它的 ViewController 调用详细 PageViewController 中的函数【英文标题】:Call a function in a detail PageViewController from the ViewController that loads it 【发布时间】:2017-12-23 23:06:02 【问题描述】:

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

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

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

所以我认为以编程方式添加按钮的唯一方法是在相册VC 中。 (我尝试在 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 可选值

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

【问题讨论】:

【参考方案1】:

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

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

让你 ItemController 遵守那个协议。

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

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

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

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

【讨论】:

以上是关于从加载它的 ViewController 调用详细 PageViewController 中的函数的主要内容,如果未能解决你的问题,请参考以下文章

应该从父 ViewController 还是子 ViewController 调用 popViewController?

ViewController 的出口视图首先是非零,然后从包加载时为零

整理ViewController的生命周期和加载过程

需要从另一个viewController调用其他viewController中的方法

在RelationshipSegue之后调用ViewController中的函数

ViewController 将结果返回给调用它的 ViewController [重复]