[BMI計算機3]Series&Navigation


前回のレッスンでViewControllerが直接符号化してサブビューを生成した場合、今回はstoryboardで生成します.

Segues


ファイルの作成

  • file - new - cocoa touch class - UIViewController
  • import UIKit
    
    class _ResultViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Do any additional setup after loading the view.
        }
  • さっき直接定義した部分は自動的に設定されています.
  • SubViewとViewControllerの接続


  • 計算結果値をIBOUTLE(bmiLabel)
  • に接続する
    結果値
  • から出力advice文もIBOUTLE接続
  • である.

    Segueの作成(スロット)


    駐車場

  • セグウェイで画面切り替え
  • シーケンス画像ボードにより出発地と目的地を直接指定
  • セグウェイ
    2つのビューコントローラに接続する画面切替オブジェクト
  • オブジェクトを作成するには:

    現在のModallyを選択
  • の上の画面のように、矢印内の長方形を押すと、画面切り替えタイプ(遷移タイプ)を変更できます.
  • 矢印はセグウェイの流れを示す.
  • SegueのIdentifier名をGoToResultに変更します.
  • bmi結果値サブビューに出力

  • CalculateViewControllerクラスからbmiValueを初期化var bmiValue = "0.0"
  • segue prepare関数でbmiValueの目標値周期
  • を変更
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if segue.identifier == "goToResult"{
                let destinationVC = segue.destination as! ResultViewController
                destinationVC.bmiValue = bmiValue
            }
        }
  • ResultViewControllerクラスで、bmiValue値をbmilabelのテキスト属性としてviewDidLoad関数に入れます.
  •     override func viewDidLoad() {
            super.viewDidLoad()
            
            bmiLabel.text = bmiValue
        }

    recalculateボタンを実行して前のボタンに戻ります

  • resultViewControlで、次のrecalculatePressed関数を完了します.
  •     @IBAction func recalculatePressed(_ sender: UIButton) {
            self.dismiss(animated: true, completion: nil)
        }

    MVCモードと成果物の適用



    Model - CalculatorBrain
    
    
    import UIKit
    
    struct CalculatorBrain {
    
        var bmi:BMI?
    
        func getBMIValue() -> String{
            
            let bmiTo1DecimalPlace = String(format: "%.1f", bmi?.value ?? 0.0)
                return bmiTo1DecimalPlace
            }
        
        
        func getAdvice() -> String {
            return bmi?.advice ?? "No advice"
        }
        
        
        func getColor() -> UIColor {
            return bmi?.color ?? UIColor.white
        }
        
        mutating func calculateBMI(height: Float, weight: Float) {
            let bmiValue = weight / pow(height, 2)
            // bmi = BMI(value: bmiValue, advice: <#T##String#>, color: <#T##UIColor#>)
            
    
                if bmiValue < 18.5 {
                    bmi = BMI(value: bmiValue, advice: "저체중입니다. 더 많은 음식을 섭취해도 되겠어요!", color: UIColor(red: 0.77, green: 0.87, blue: 0.96, alpha: 1.00))
                    
                } else if bmiValue < 24.9 {
                    bmi = BMI(value: bmiValue, advice: "정상체중입니다.지금처럼 균형을 유지하세요!", color: UIColor(red: 0.76, green: 0.88, blue: 0.77, alpha: 1.00))
                              
                } else {
                    bmi = BMI(value: bmiValue, advice: "과체중입니다. 균형잡힌 식사를 하고, 운동량을 늘리세요!", color: UIColor(red: 0.92, green: 0.59, blue: 0.58, alpha: 1.00))
                }
        }
    }
    Model- BMI
    import UIKit
    
    var calculator = CalculatorBrain()
    
    
    struct BMI {
        let value: Float
        let advice: String
        let color: UIColor
    }
    Controllers - calculateViewController
    import UIKit
    
    class calculateViewController: UIViewController {
        
        // var bmiValue = "0.0"
        var calculatorBrain = CalculatorBrain()
        
        @IBOutlet weak var heightLabel: UILabel!
        @IBOutlet weak var weightLabel: UILabel!
        
        @IBOutlet weak var heightSlider: UISlider!
        @IBOutlet weak var weightSlider: UISlider!
        
        
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
        }
    
    
        @IBAction func heightSliderChanged(_ sender: UISlider) {
            let height = String(format: "%.2f",  sender.value)
            
            heightLabel.text = "\(height)m"
        }
        
     
        @IBAction func weightSliderChanged(_ sender: UISlider) {
            let weight = String(Int(sender.value))
            
            weightLabel.text = "\(weight)kg"
        }
        
        @IBAction func calculatePressed(_ sender: UIButton) {
            
            let height = heightSlider.value
            // heightSlider의 property 중 value 값
            
            let weight = weightSlider.value
            // weightSlider의 property 중 value 값
            
            /*
            let bmi = weight / pow(height, 2)
            // let bmi = weight / (height * height) 와 동일함
            
            bmiValue = String(format:"%.1f", bmi)
             */
            
            // Model 생성하며 추가해주는 코드
            calculatorBrain.calculateBMI(height: height, weight: weight)
            self.performSegue(withIdentifier: "goToResult", sender: self)
            
          
        }
        
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if segue.identifier == "goToResult"{
                let destinationVC = segue.destination as! ResultViewController
                destinationVC.bmiValue = calculatorBrain.getBMIValue()
                destinationVC.advice = calculatorBrain.getAdvice()
                destinationVC.color = calculatorBrain.getColor()
            }
        }
        // as : Downcasting   
    }
    Controllers - ResultViewControllerimport UIKit
    class ResultViewController: UIViewController {
        var bmiValue: String?
        var advice: String?
        var color: UIColor?
        
        @IBOutlet weak var bmiLabel: UILabel!
        @IBOutlet weak var adviceLabel: UILabel!
        
    
        override func viewDidLoad() {
            super.viewDidLoad()
            
            bmiLabel.text = bmiValue
            adviceLabel.text = advice
            view.backgroundColor = color
        }
        
        @IBAction func recalculatePressed(_ sender: UIButton) {
            self.dismiss(animated: true, completion: nil)
        }
    }

    結果