简体   繁体   English

快速通过segue传递数据

[英]Passing Data through segue in swift 2

Hey guys I need some help here with my code, please take a look to the images to see what I see, Im making a Tip Calculator Project in Swift and It must had a settings view where I select the default tip rate, I have some errors and I must fix that as soon as posible. 大家好,我的代码需要帮助,请查看图片以查看所见内容,我在Swift中制作了一个小费计算器项目,而且必须有一个设置视图,可以选择默认小费率,我有一些错误,我必须尽快解决。 I will really appreciate that some one corrects my code and test it. 我真的很感谢有人纠正我的代码并对其进行测试。 Pic 1 ( MainViewController ) pic 2 ( MainStoryBoard ) Below is the code of the two ViewControllers, I did not post the image of the Settings View Controller because the website does not let me post more than two links until I get more reputation. 图片1( MainViewController )图片2( MainStoryBoard )下面是两个ViewController的代码,我没有发布Settings View Controller的图像,因为在获得更多声誉之前,网站不允许我发布两个以上的链接。

import UIKit

class ViewController: UIViewController, SettingDelegate {
    // Inputs
    @IBOutlet weak var amountTextField: UITextField!
    //Labels
    @IBOutlet weak var TipPercentageLabel: UILabel!
    @IBOutlet weak var numberOfPersonLabel: UILabel!
    @IBOutlet weak var tipAmountLabel: UILabel!
    @IBOutlet weak var totalBillLabel: UILabel!
    @IBOutlet weak var billPerPersonLabel: UILabel!
    //Slider & Stepper
    @IBOutlet weak var tipSlider: UISlider!
    @IBOutlet weak var personsStepper: UIStepper!
    //Variables
    var tipPercentage : Double = NSUserDefaults.standardUserDefaults().doubleForKey("DefaultTipRate") ?? 0.20
    var numberOfPerson:Int = 1
    let numberFormatter:NSNumberFormatter = NSNumberFormatter()


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        tipAmountLabel.text = "$0.00"
        totalBillLabel.text = "Bill Total"
        billPerPersonLabel.text = "$0.00"
        TipPercentageLabel.text =  "20.0%"
        numberOfPersonLabel.text = "1"
        self.amountTextField.becomeFirstResponder()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    func setupContainer() {


        tipSlider.minimumValue = 0
        tipSlider.maximumValue = 100
        tipSlider.value = 20
        tipSlider.addTarget(self, action: "sliderTipChanged:", forControlEvents: .ValueChanged)

        personsStepper.minimumValue = 1
        personsStepper.maximumValue = 30
        personsStepper.value = 1
        personsStepper.addTarget(self, action: "sliderPersonChanged:", forControlEvents: .ValueChanged)

        amountTextField.text = ""

        refreshCalculation()

    }

    @IBAction func OnEditingFieldBill(sender: AnyObject) {

        refreshCalculation()
    }

    func refreshCalculation() {

        numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
        if let amount = numberFormatter.numberFromString(amountTextField.text!) as? Double {

            let tipAmount = amount * tipPercentage
            let totalBill = amount + tipAmount
            let billPerPerson = totalBill / Double(numberOfPerson)
            numberFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
            tipAmountLabel.text = numberFormatter.stringFromNumber(tipAmount)
            totalBillLabel.text = numberFormatter.stringFromNumber(totalBill)
            billPerPersonLabel.text = numberFormatter.stringFromNumber(billPerPerson)

        } else {

            tipAmountLabel.text = "-"
            totalBillLabel.text = "-"
            billPerPersonLabel.text = "-"
        }

        numberFormatter.numberStyle = NSNumberFormatterStyle.PercentStyle
        numberFormatter.minimumFractionDigits = 1
        numberFormatter.maximumFractionDigits = 1
        TipPercentageLabel.text = self.numberFormatter.stringFromNumber(tipPercentage)

       numberOfPersonLabel.text = "\(numberOfPerson)"

    } 

    @IBAction func sliderTipChanged(sender: UISlider) {

        tipPercentage = Double(round(tipSlider.value)) / 100
        refreshCalculation()
    }


    @IBAction func StepperPersonChanged(sender: UIStepper) {
        numberOfPerson = Int(round(personsStepper.value))
        refreshCalculation()
    }
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let SettingsViewController = segue.destinationViewController as?SettingsViewController {
            SettingsViewController.delegate = newValue
            refreshCalculation()
                }
            }

    }

Bellow is the code of the SettingsViewController 波纹管是SettingsViewController的代码

import UIKit
protocol SettingDelegate {
    func tipPercentageChanged(newValue : Double)
}
class SettingsViewController: UIViewController {
    var destName : String!
    var delegate : SettingDelegate?
    @IBOutlet weak var tipControl: UISegmentedControl!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    @IBAction func DefaultRate(sender: AnyObject) {
        var tipRates = [0.05, 0.10, 0.15, 0.20, 0.25, 0.30]
        let tipRate = tipRates[tipControl.selectedSegmentIndex]

        delegate?.tipPercentageChanged(tipRate)

        NSUserDefaults.standardUserDefaults().setDouble(tipRate, forKey: "DefaultTipRate")
        NSUserDefaults.standardUserDefaults().synchronize()

    }

You have to add your delegate function into your ViewController class because your delegate function is not an optional. 您必须将委托函数添加到ViewController类中,因为委托函数不是可选的。

Add this in your ViewController class: 将此添加到您的ViewController类中:

func tipPercentageChanged(newValue : Double) {
    //your code
}

First, you have not implemented the tipPercentageChanged method in the ViewController class. 首先,您尚未在ViewController类中实现tipPercentageChanged方法。 Since tipPercentageChanged is a required method of the SettingDelegate protocol, you must implement this to conform to protocol. 由于tipPercentageChanged是SettingDelegate协议的必需方法,因此必须实现此方法以符合协议。

Second, in prepareForSegue 第二,在prepareForSegue中

        SettingsViewController.delegate = newValue

should actually be 实际上应该是

        SettingsViewController.delegate = self

Since the delegate of SettingsViewController, will be ViewController. 由于SettingsViewController的委托,将是ViewController。

So your updated code in ViewController should be 因此,您在ViewController中更新的代码应为

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let SettingsViewController = segue.destinationViewController as?SettingsViewController {
        SettingsViewController.delegate = self
        refreshCalculation()
    }
}

func tipPercentageChanged(newValue: Double) {

    // What you want to do, when Percentage is changed
    // Update tipSlider
    tipSlider.value = Float(newValue)
}

Try this : 尝试这个 :

Replace your prepareForSegue function with : 将您的prepareForSegue函数替换为:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let SettingsViewController = segue.destinationViewController as?SettingsViewController {
    SettingsViewController.delegate = self
    refreshCalculation()
}
}

and add tipPercentageChanged function 并添加tipPercentageChanged函数

func tipPercentageChanged(newValue: Double) {
     TipPercentageLabel.text =  "\(newValue)%" //reset label value
     tipSlider.value = newValue //reset slider value too
}

Hope it helps! 希望能帮助到你!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM