2015-12-10 3 views
0

Привет, ребята, мне нужна помощь здесь с моим кодом, пожалуйста, взгляните на изображения, чтобы увидеть, что я вижу, Im делает проект калькулятора подсказок в Swift и должен иметь представление настроек, где Я выбираю скорость опроса по умолчанию, у меня есть некоторые ошибки, и я должен исправить это как можно скорее. Я очень признателен, что кто-то исправляет мой код и проверяет его. Pic 1 (MainViewController) pic 2 (MainStoryBoard) Ниже приведен код двух ViewControllers, я не размещал изображение Контроллера настроек, потому что веб-сайт не позволяет мне отправлять более двух ссылок, пока я не получу больше репутации.Передача данных через segue in swift 2

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() 
       } 
      } 

    } 

пыльник является код 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() 

    } 

ответ

0

Во-первых, вы не реализован tipPercentageChanged метод в классе ViewController. Начиная с tipPercentageChanged - это необходимый метод протокола SettingDelegate, вы должны реализовать его для соответствия протоколу.

Во-вторых, в prepareForSegue

 SettingsViewController.delegate = newValue 

должно быть на самом деле

 SettingsViewController.delegate = self 

С делегатом SettingsViewController, будет ViewController.

Таким образом, ваш обновленный код в 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) 
} 
+0

Спасибо, но как будет выглядеть мой код. Я новый в этом. Так что мне нужно написать ниже функции. Когда процент изменяется, я хочу, чтобы ползунок и значения были равны этому проценту. Как я могу это записать? – aeee

+0

Я делаю то, что вы сказали, но у меня есть некоторые проблемы, если вы можете мне помочь, я буду признателен – aeee

+0

Конечно, я постараюсь.с какими проблемами вы сталкиваетесь? – UditS

1

Вы должны добавить функцию делегата в ваш ViewController класса, потому что ваша функция делегата не является обязательным.

Добавить это в ViewController классе:

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

Извините, я не понимал, Im очень новый в этом, это только мой первый проект. – aeee

+0

Это может вам помочь: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html –

+0

Спасибо за вашу помощь. Я очень ценю это, но я не понял, это выше мой уровень – aeee

0

Попробуйте это:

prepareForSegue Заменить функцию с:

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

и добавить tipPercentageChanged функция

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

Надеюсь, это поможет!

+0

В нем говорилось, что я могу определить тип значения Double to Float – aeee

Смежные вопросы