【问题标题】:Passing Data from SettingsView Controller to Mainstoryboard - Swift将数据从 SettingsView 控制器传递到 Mainstoryboard - Swift
【发布时间】:2017-03-09 22:50:24
【问题描述】:

我是 iOS 应用程序开发的新手,正在尝试构建一个小费计算器。该应用程序的基本功能已完成。我的 Mainstoryboard 有一个分段控件,它显示三个 % 值,例如 10、20、30。有一个设置按钮,单击它会将我带到一个新页面,并在分段控件中显示类似的 % 值。

我想要做的是,当点击一个数字(一个段)时,它应该保存为默认的 tip% 值。我应该如何将此值传递给我编写了一个函数来计算小费金额的 Mainstoryboard 函数?

【问题讨论】:

    标签: ios swift settings


    【解决方案1】:

    我想你正在使用 segue 移动到另一个视图,所以使用 prepareForSegue 方法:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "tipSegue"
        {
            if let destinationVC = segue.destinationViewController as? OtherViewController {
                destinationVC.tipPercent = someValue
            }
        }
    }
    

    【讨论】:

    • 谢谢!我使用了下面的行并且值没有被传递: override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "showSettings"{ let settingsVC:SettingsViewController = segue.destination as! SettingsViewController settingsVC.delegate = self } }
    【解决方案2】:

    您可以编写protocol 来设置默认百分比,并让您的MainViewController 符合该协议。当用户点击SettingsViewController 中的按钮时,您可以调用一个函数(在协议中定义)让“委托”(MainViewController)知道发生了什么,并相应地设置您的default 变量。如果这是一个永久设置,最好使用UserDefaults,因为这正是它的设计目的。然后,在加载 MainViewController 后,您可以访问该 UserDefaults 变量(如果存在)。

    一点协议帮助:

    您的协议可以非常简单地定义 - 类似这样(这必须在您的 viewControllers 之外声明 - 我经常在相关 viewController 的类声明之上这样做):

    protocol SettingsDelegate {
        func didUpdateDefaultTipPercent(to percent: Float)
    }
    

    协议声明就是这样,除非您预计需要其他功能。请注意,您实际上并没有定义该函数的功能 - 每个符合协议的 viewController 可能有不同的定义。

    然后,在您的 settingsViewController 中,您可能有一个用于协议遵循者的可选变量,如下所示:

    weak var settingsDelegate: SettingsDelegate?
    

    在用户选择默认百分比后,您可以安全地检查委托是否存在并将新数字传递给委托,如下所示:

    if let delegate = self.settingsDelegate {
        delegate.didUpdateDefaultTipPercent(to: 15.0) //this "15.0" will come from your segmented control action or whatever
    }
    

    在您的MainViewController 中,在您的prepareFor(segue... 中,您需要检查是否要进行设置,并将Main 设置为代表:

    ...
    if let settings = segue.destination as? SettingsViewController {
        settings.settingsDelegate = self
    }
    

    最后,您需要使您的MainViewController 符合协议。我通常将其作为扩展名,以便更容易找到,并使其与其他事物分开:

    extension MainViewController: SettingsDelegate {
        func didUpdateDefaultTipPercent(to percent: Float) {
            self.defaultPercentage = percent
        }
    }
    

    【讨论】:

    • 谢谢!是的,我正在尝试使用 UserDefaults。但是我不知道如何使用协议和委托。有什么帮助吗?
    • @NinjaCowgirl 好的,我在编辑中添加了完整的实现。看上面。最终,如果这是一个永久设置,那么 UserDefaults 就是要走的路。在这种情况下,您实际上并不需要该协议,但理解并能够实施它是一件非常有价值的事情。
    • 非常感谢!我会检查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    相关资源
    最近更新 更多