我正在开发一个有两个不同视图的应用程序,它可以模态地呈现一个“settings”viewController,其中嵌入了一个tableView。要将数据从嵌入式tableView传递到前两个视图,我必须在每个视图转换中使用prepareForSegue(据我所知)。但是,当我进入“设置”视图并点击“完成”时,我想回到之前的视图。为了做到这一点,就我所知,人们不得不忽视这个观点。在解除视图时,我可以将数据从一个视图传递到另一个视图吗?如果没有,这将如何实现?
注意:请随意纠正我,我仍在开始应用程序开发,我说的一些事情可能完全错误。
答案 0 :(得分:1)
有几种方法可以实现这一目标。
您可以将呈现的视图控制器中的展开segue 定义回到另一个视图控制器(通常是执行原始演示的VC)。展开segue可以从按钮触发,就像“常规”segue一样,由于它们是segv,它们会在解散VC中触发id
。您可以使用它,就像您将数据推回去一样。放松细分记录在this tech note。
或者,您可以将委派从显示的视图控制器设置为另一个VC。这种模式在iOS开发中被广泛使用,涉及几个步骤:
-prepareForSegue:
。使该方法使用您想要传回的数据的参数。settingsDidChange(_:)
的弱delegate
属性。首次展示该VC时,请将代理设置为演示者。SettingsDelegate?
中有完成按钮,传递新数据。呈现VC将接收此调用并在设置解除时更新。第一次设置委派模式可能很棘手,但随着时间的推移变得更容易。它记录在案here。
最后,您可以使用持久性数据存储来隐藏设置。用户默认设置是设置数据的一个很好的选项 - 它允许您以一种可在整个过程中访问的方式保存键/值对信息应用程序。阅读用户默认值here。
要在用户默认值更改时更新,您可以让设置控制器在解除时发布通知。然后,您应用中的其他VC可以监听此通知并根据需要进行更新。
答案 1 :(得分:-2)
你对prepareForSegue
是正确的,你不能在这里使用它,因为你需要使用dismiss来弹出导航堆栈的设置viewController
。一个非常简单的解决方案是定义一个全局变量。全局变量只是一个存在于应用程序中任何类范围之上的变量。例如,在您的设置viewController
文件中,您可以执行此操作。
var globalVariable: String
class Settings: ViewController{
//view controller stuff
didSelectRowAtIndexPath{
globalVariable = "Information"
}
}
然后,当您使用dismiss方法时,您之前的viewcontroller将能够以globalVariable
的形式访问该变量。它不必是字符串,您不必在didSelectRowAtIndexpath
中设置它,您可以随意使用它。