【问题标题】:Passing data while dismissing a view在关闭视图时传递数据
【发布时间】:2017-02-26 00:56:04
【问题描述】:

我正在开发一个具有两个不同视图的应用程序,它们可以模态地呈现一个“设置”视图控制器,其中嵌入了一个 tableView。要将数据从嵌入式 tableView 传递到前两个视图,我必须在每个视图转换中使用 prepareForSegue(据我所知)。但是,当我在“设置”视图中并点击“完成”时,我想回到之前的视图。据我所知,为了做到这一点,人们必须摒弃这种观点。我可以在关闭视图时将数据从一个视图传递到另一个视图吗?如果没有,这将如何实现?

注意:请随时纠正我,我仍在开始应用程序开发,我所说的某些内容可能完全错误。

【问题讨论】:

    标签: ios swift xcode uitableview segue


    【解决方案1】:

    有几种方法可以实现这一点。

    你可以定义一个 unwind segue 从你呈现的视图控制器回到更远的另一个视图控制器(通常是进行原始呈现的 VC)。展开转场可以像“常规”转场一样从按钮触发,并且由于它们是转场,它们会在解雇 VC 中触发-prepareForSegue:。您可以像使用其他方式将数据推回一样使用它。放松转场记录在this tech note


    或者,您可以设置 委托 从呈现的视图控制器到另一个 VC。此模式在 iOS 开发中广泛使用,涉及几个步骤:

    • 为要遵守的类定义一个协议(“SettingsDelegate”)。给它一个方法——比如settingsDidChange(_:)。使该方法接受您要传回的数据的参数。
    • 给你的设置控制器一个弱的delegate属性SettingsDelegate?。首次展示该 VC 时,将委托设置为展示者。
    • 使呈现的 VC 符合委托协议,并按照您认为合适的方式实现更新方法。
    • 在提供的 VC 调用 self.delegate.settingsDidChange(_:) 中有完成按钮,传递新数据。演示的 VC 将收到此调用并在设置关闭时更新。

    第一次设置委托模式可能会很棘手,但随着您的使用会变得更容易。它记录在here


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

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

    【讨论】:

    • 非常感谢您的回答!您认为哪种方法不太复杂?
    • 对于设置视图,我建议使用 UserDefaults。它是专门为支持用户可以自定义的设置而构建的,并且相对容易开始使用(并且非常可靠)。
    • 我可以在 viewDidLoad 中收到通知,但是每次我关闭设置控制器时,视图都不会自行加载。如何在收到通知的视图中不断更新此通知?
    【解决方案2】:

    您对prepareForSegue 的看法是正确的,您不能在此处使用它,因为您需要使用dismiss 才能将设置viewController 从导航堆栈中弹出。一个非常简单的解决方案是定义一个全局变量。全局变量只是存在于应用程序中任何类范围之上的变量。例如,在您的设置viewController 文件中,您可以这样做。

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

    然后,当您使用解除方法时,您之前的视图控制器将能够以globalVariable 访问该变量。不必是字符串,也不必在didSelectRowAtIndexpath中设置,你可以随意使用。

    【讨论】:

    • 全局状态通常被认为是 iOS 应用程序开发中的一种反模式。还有几种更本地化的方法可以“传回”数据,而不会在应用程序周围乱扔全局变量。
    • 这是我能想到的唯一方法,你能举个例子吗?
    • 查看我的答案:展开转场、委托和用户默认值均可用。除此之外,您还可以使用键值观察、不同的持久存储(如 Core Data 堆栈),或者设计您自己的 API 来接收完成块。有很多选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多