2017-06-22 15 views
2

私はUISegmentedControlを学習しようとしていて、ifステートメント内で動作するようにして、選択に基づいて1つの値を返し、他の選択に基づいて別の値を返す方法を理解したいと考えています。 UISegmentが返すことができる値は「固定」または「Varibale」の2つだけです。以下のコードは動作しませんが、私が望むものを提供します。 2つの変数はあらかじめ定義されています。UISegmentedControl ifステートメント

@IBAction func calPenalty(_ sender: UIButton) { 

    let startDate = termStartDate.text 
    let mortgageTerm = Double(mortgageTermLabel.text!) 
    let discount = Double(mortgageDiscountLabel.text!) 
    let mtgCashback = Double(casbackRecieved.text!) 
    let mtgBalance = Double(mortgageBalance.text!) 
    let rate = Double(currentRate.text!) 
    //let mortgageType = mortgageType 

    let lender = Global.selectedRate 
    if let oneYear = Double((lender?.oneYear)!), 
     let twoYear = Double((lender?.twoYear)!), 
     let threeYear = Double((lender?.threeYear)!), 
     let fourYear = Double((lender?.fourYear)!), 
     let fiveYear = Double((lender?.fiveYear)!) { 

     let maturityDate = (getMaturityDate(startdate: startDate!, termMonths: Int(mortgageTerm!))) 

     let monthsToMaturity = daysBetweenDates(endDate: maturityDate)/365*12 

     let comparisonTerm = (IRDComparisonTerm(monthsToMaturity: monthsToMaturity)) 

     let cashback = cashbackRepayment(cashbackRecieved: mtgCashback!, mtgTerm: Double(mortgageTerm!), mthsToMaturity: Double(monthsToMaturity)) 

     print(cashback) 


     var comparisonRate: Double = 0 

     switch comparisonTerm 
     { 
     case 12: 
      comparisonRate = oneYear 

     case 24: 
      comparisonRate = twoYear 

     case 36: 
      comparisonRate = threeYear 
     case 48: 
      comparisonRate = fourYear 
     case 60: 
      comparisonRate = fiveYear 

     default: 
      comparisonRate = 0 

     } // end switch statement 

     print(comparisonRate) 

     let IRD = IRDPenalty(IRDComparisonRate: comparisonRate, mtgBalance: mtgBalance!, mthsToMaturity: Double(monthsToMaturity), discount: discount!, currentRate: rate!) 

     let threeMthsInterestPenalty = threeMonthsInterestPenalty(mtgBalance: mtgBalance!, mtgRate: rate!) 

     print (IRD) 
     print (threeMthsInterestPenalty) 


     var penalty: Double = 0 
     // var totalPenalty: Double = 0 

     if IRD > threeMthsInterestPenalty { 

      penalty = IRD + cashback 
     }else{ 

      penalty = threeMthsInterestPenalty + cashback 
     } 



     // totalPenalty = penalty + cashback 

     calculationLabel.text = String(penalty) 


    } 

} 
// triggers result based on value selected 
    @IBAction func valueChanged(_ sender: UISegmentedControl) { 

    switch sender.selectedSegmentIndex { 
    case 0: 
     calculationLabel.text = String(penalty) 

    case 1: 
     calculationLabel.text = String(threeMthsInterestPenalty + cashback) 

    default: 
     calculationLabel.text = String(penalty) 
    } 


} 

編集:私はまだこの問題に取り組んでいます。上記のコードを更新して、IBAction内のすべてのコードを表示しました。 @IBActionは、変数がコード内のどこに投稿されたかに基づいて未定義であるため、機能しません。ストーリーボードには、固定値と変数の値を持つUIsegmentedControlがあります。ユーザーが固定値を選択した場合、UISegementコントロールのIBActionで表示します。

+0

にあなたが投稿したコードへのコンテキストがありません。使用されているすべての変数は何ですか?あなたが実際にやろうとしていることは何ですか?また、 'UISegmentedControl'は値を返しません。どのセグメントが選択されているかを判断するだけです。 – rmaddy

+0

どの変数が未定義ですか? – Lawliet

答えて

0

セグメント化されたコントロールの値変化、そしてあなたは、プログラムでそれをしたい、あなたはまずvalueChanged定数を使用して、ターゲット・アクションメソッドを登録する必要があります。その後、あなたのvalueChanged機能を記述します。詳細についてはthisをチェックしてください。

import UIKit 

class ViewController: UIViewController { 

    // Reference from Storyboard or Interface Builder 
    @IBOutlet weak var mortgageType: UISegmentedControl! 

    // For set up a UISegmentedControl programmatically 
    var segmentedControl: UISegmentedControl! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func loadView() { 
     super.loadView() 

     // Programmatically setup 
     let items = ["Cinnamon", "Clove"] 
     segmentedControl = UISegmentedControl(items: items) 
     segmentedControl.selectedSegmentIndex = 0 
     segmentedControl.frame = CGRect(x: 120, y: 200, width: 200, height: 30) 
     segmentedControl.tintColor = UIColor.black 
     segmentedControl.addTarget(self, action: #selector(self.valueChanged(_:)), for: .valueChanged) 
     self.view.addSubview(segmentedControl) 
    } 

    @IBAction func valueChanged(_ sender: UISegmentedControl) { 
     switch sender.selectedSegmentIndex { 
     case 0: 
      print("Hi") 

     case 1: 
      print("Bye") 

     default: 
      print("Nothing") 
     } 
    } 
} 

あなたを参照する場合StoryboardとInterface BuilderのUISegmentedControl。アクションも追加する必要があります。 enter image description here

更新、編集された質問

@IBAction func calPenalty(_ sender: UIButton) { 
    if mortgageType.selectedSegmentIndex == 0 { 
     print("Fixed") 
    } else { 
     print("Variable") 
    } 
} 
+0

返信いただきありがとうございます。元の投稿にコメントを追加しました。私はまだ解決策に向かって取り組んでいます。 –

+0

インターフェースビルダーやストーリーボードを使用する場合は、UIからアクションを追加する方法がわかっている場合は、 'segmentedControl'やさらに' addTarget'を設定する必要はありません。あなたの編集した質問によると、「何か」は「こんにちは」、「他のことはやりなさい」は「バイ」となります。 – Lawliet

+0

セットアップ機能に何を追加する必要があるかわかりません。これは私のコントローラの詳細です "@IBOutlet weak var mortgageType:UISegmentedControl!" –