在解散视图的同时传递数据

我正在一个应用程序与两个不同的意见,可以模态地呈现一个“设置”viewController与embedded在其中的tableView。 为了将数据从embedded的tableView传递给前两个视图,我将不得不在每个视图转换中使用prepareForSegue(以我的理解)。 但是,当我在“设置”视图中点击“完成”时,我想回到之前的视图。 为了做到这一点,就我所知,人们不得不放弃这个观点。 可否将数据从一个视图传递到另一个视图? 如果没有,这将如何完成?

注意:随时纠正我,我还在开始应用程序开发,我说的一些事情可能是完全错误的。

有几种方法可以做到这一点。

你可以定义一个从你呈现的视图控制器退回到另一个视图控制器(通常是做原始演示文稿的VC)。 Unwind segues可以像button一样触发button,因为它们是segues,所以它们会在dismissing VC中触发-prepareForSegue: 您可以像使用它一样将数据推回。 本技术说明logging了放卷的细节。


或者,你可以设置委托从提出的视图控制器到另一个VC。 这种模式在iOS开发中被广泛使用,涉及几个步骤:

  • 为符合的类定义一个协议(“SettingsDelegate”)。 给它一个方法 – 像settingsDidChange(_:) 。 使该方法与您想要传回的数据进行争论。
  • 给你的设置控制器一个types为SettingsDelegate?的弱delegate属性SettingsDelegate? 。 首次展示VC时,将代表设置为演示者。
  • 使提交的VC符合委托协议,并按照您认为合适的方式实施更新的方法。
  • 在提出的VC调用中,完成buttonself.delegate.settingsDidChange(_:) ,传递新的数据。 呈现VC将得到这个调用,并更新为设置closures。

委派模式可能会第一次难以设置,但随着时间的推移变得更加容易。 这是logging在这里 。


最后,您可以使用持久性数据存储来存储设置。UserDefaults对于设置数据来说是一个不错的select,它可以让您以整个应用程序都可访问的方式保留键/值对信息。 在这里阅读用户默认值。

要更新用户默认值更改时,您可以让您的设置控制器解雇时发布通知。 然后,您的应用中的其他VC可以侦听此通知并根据需要进行更新。

你对prepareForSegue是正确的,你不能在这里使用它,因为你需要使用dismiss为了从导航堆栈popup设置viewController 。 一个非常简单的解决scheme就是定义一个全局variables。 一个全局variables只是一个variables,存在于你的应用中任何类的范围之上。 例如,在您的设置viewController文件,你可以做到这一点。

 var globalVariable: String class Settings: ViewController{ //view controller stuff didSelectRowAtIndexPath{ globalVariable = "Information" } } 

然后,当你使用dismiss方法时,你以前的viewcontroller将能够访问该variables作为globalVariable 。 它不一定是一个string,你不必将其设置在didSelectRowAtIndexpath ,你可以使用它。