2017-02-26 66 views
0

我正在研究一个具有两个不同视图的应用程序,它们可以模态地呈现嵌入了tableView的“settings”viewController。为了将数据从嵌入的tableView传递给前两个视图,我必须在每个视图转换中使用prepareForSegue(以我的理解)。但是,当我在“设置”视图中点击“完成”时,我想回到之前的视图。据我所知,为了做到这一点,人们不得不驳回这一观点。在解散视图时,我可以将数据从一个视图传递到另一个视图吗?如果不是,这将如何完成?在解散视图时传递数据

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

回答

1

有几种方法可以完成此操作。

您可以定义一个从您提交的视图控制器退回到更远的另一个视图控制器(通常是执行原始演示文稿的VC)后退出segue。展开的顺序可以从按钮触发,就像“常规”顺序一样,并且由于它们是顺序的,它们会触发解除VC中的-prepareForSegue:。您可以像使用它那样将数据推回。放松时间记录在this tech note中。


或者,您可以从所呈现的视图控制器到另一个VC建立代表团。这个图案被广泛用于在IOS发展,涉及几个步骤:

  • 定义的类,以符合协议(“SettingsDelegate”)。给它一个方法 - 像settingsDidChange(_:)。使该方法对您想要传回的数据进行参数化。
  • 给你的设置控制器弱delegateSettingsDelegate?类型的财产。首次展示VC时,请将代表设置为演示者。
  • 使呈现的VC符合委托协议,并按照您认为合适的方式实施更新方法。
  • 在提示的VC调用self.delegate.settingsDidChange(_:)中有Done按钮,传递新数据。呈现的VC将获得此调用,并在Settings关闭时进行更新。

委派模式可能会第一次难以设置,但随着您的进行变得更加容易。它记录在here


最后,你可以使用一个持久性数据存储在藏匿设置UserDefaults是设置数据一个不错的选择 - 它可以让你保持信息的键/值对的方式,就是在你的应用程序访问。阅读用户默认设置here

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

+0

非常感谢您的回答!你认为哪种方法更简单? – Gabe12

+0

对于设置视图,我建议UserDefaults。它专门为支持用户可以自定义的设置而构建,并且相对容易开始使用(并且非常可靠)。 – Tim

+0

我可以在viewDidLoad中收到通知,但每次关闭设置控制器时视图都不会自动加载。我怎样才能在接收它的视图中不断更新此通知? – Gabe12

-2

你对prepareForSegue是正确的,你不能在这里使用它,因为你需要使用关闭为了弹出设置viewController关闭导航堆栈。一个非常简单的解决方案就是定义一个全局变量。全局变量只是一个变量,它存在于应用程序中任何类的范围之上。例如,在您的设置viewController文件中,您可以执行此操作。

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

然后,当您使用dismiss方法时,您以前的viewcontroller将能够访问该变量作为globalVariable。它不必是一个字符串,并且您不必将其设置在didSelectRowAtIndexpath中,您可以根据需要使用它。

+2

全局状态通常被认为是iOS应用程序开发中的反模式。还有几种本地化的方式可以将数据“回传”,而不会在应用程序周围乱抛垃圾。 – Tim

+0

这是我能想到的唯一方法,你能提供一个例子吗? –

+0

查看我的答案:展开细分,委派和用户默认值都可用。除此之外,您可以使用键值观察,不同的持久性存储(如核心数据堆栈),或者设计自己的API来获取完成块。有很多选择。 – Tim