Ios 将数据从设置视图控制器传递到主电路板-Swift

Ios 将数据从设置视图控制器传递到主电路板-Swift,ios,swift,settings,Ios,Swift,Settings,我是一个iOS应用程序开发新手,试图构建一个tip计算器。应用程序的基本功能已完成。我的MainstryBoard有一个段控件,它显示3%的值,如10、20、30。有一个设置按钮,单击该按钮可将我带到一个新页面,并在段控件中显示类似的%值 我想做的是,当一个数字被点击(一段)时,它应该被保存为默认的tip%值。我应该如何将该值传递给Mainstoryboard函数,我在该函数中编写了一个计算小费金额的函数?我想您正在使用一个segue移动到另一个视图,因此请使用prepareForSegue方法

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


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

我想您正在使用一个segue移动到另一个视图,因此请使用prepareForSegue方法:

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

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

一点协议帮助:

您的协议可以定义得非常简单—类似这样(必须在viewController之外声明—我通常在相关viewController的类声明之上声明):

这就是协议声明,除非您预期需要其他函数。请注意,实际上并没有定义该函数的功能-符合该协议的每个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是一个不错的选择。在这种情况下,你并不真的需要协议,但它是一个非常有价值的工具ing需要理解并能够实现。非常感谢!我会检查一下。谢谢!我使用了下面的一行,但没有传递值:override func prepare(对于segue:UIStoryboardSegue,发送方:Any?{if segue.identifier==“showSettings”{let settingsVC:SettingsViewController=segue.destination as!SettingsViewController setingsvc.delegate=self}
extension MainViewController: SettingsDelegate {
    func didUpdateDefaultTipPercent(to percent: Float) {
        self.defaultPercentage = percent
    }
}