0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

11日目:チップ計算アプリで、segueを学ぶ

Posted at

#11日目のアプリ
チップ計算アプリで、segueを学ぶ

##以下の流れで作りました。

  1. 画面を2つ用意する。
  2. 各画面にオブジェクトを配置して、Viewcontrolerに紐付け
  3. stepパーツ、テキストフィールド入力、選択ボタンで入力する数値を取得
  4. 計算結果を別のView に表示するようにsegueを設置
  5. 数値を受け渡す。

##できたこと

  • テキストフィールドに入力した内容を取得して利用
  • 別画面に値を渡す
  • 別画面を閉じる。

##書いたコードを共有します!

▼▼▼CalculatorViewController.swift

import UIKit

class CalculatorViewController: UIViewController, UITextFieldDelegate {
    
    
    @IBOutlet weak var billTextField: UITextField!
    @IBOutlet weak var zeroPctButton: UIButton!
    @IBOutlet weak var tenPctButton: UIButton!
    @IBOutlet weak var twentyPctButton: UIButton!
    @IBOutlet weak var splitNumberLabel: UILabel!
    
    var nameOfPressedButton: String = "0%"
    var setValue: Float = 0.0 //チップのパーセンテージ
    var setPeopleNumbers: Double = 2.0 //人数
    
    var totalCost: Int = 0
    
    
    
//    func viewDidLoad() {
    //        super.viewDidLoad()
    //        // Do any additional setup after loading the view.
    //    }
    
    @IBAction func tipChanged(_ sender: UIButton) {
        billTextField.endEditing(true)
        updateUI()
        sender.isSelected = true //押したボタンをtrueにする
        nameOfPressedButton = sender.currentTitle ?? "0%"  //ボタン名を取得して格納する。nil対応も入れておく。
        
        //各ボタンを押した時に数値を設定する
        switch nameOfPressedButton {
        case "0%":
            setValue = 0.0
            
        case "10%":
            setValue = 0.1
            
        case "20%":
            setValue = 0.2
            
        default:
            print("not selected.")
        }
    }
    
    @IBAction func stepperValueChanged(_ sender: UIStepper) {
        billTextField.endEditing(true)
        setPeopleNumbers = sender.value
        splitNumberLabel.text = String(format: "%.0f", setPeopleNumbers)
        
    }
    
    @IBAction func totalCost(_ sender: UITextField) {
        billTextField.clearButtonMode = .always
        billTextField.keyboardType = .phonePad
        billTextField.resignFirstResponder()
        
    }
    
    @IBAction func calculatePressed(_ sender: UIButton) {
        
        totalCost = Int(billTextField.text!) ?? 0
        print(totalCost)
        print(setValue)
        print(setPeopleNumbers)
        
        print(Float(totalCost) * Float((1 + setValue)) / Float(setPeopleNumbers))
        
        billTextField.endEditing(true) //テキストフィールドをアンアクティブにする
        
        //結果をセグエ"goToResult"へ持たせてあげる。
                performSegue(withIdentifier: "ResultScreen", sender: self)
    
        
    }
    
    //結果を見るボタンを押したときに、該当するセグエがあったら処理する。を記述。
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        //もしセグエが"goToResult"だったら以下をする。
        if segue.identifier == "ResultScreen" {

            //定数を作って、それに値を入れて、計算結果ResultViewControllerの変数に渡してあげる準備。
            let destinationVC = segue.destination as! ResultViewController

            //計算結果画面にある変数に計算して返ってきた数値を入れる。
            destinationVC.peopleValue = String(setPeopleNumbers)
            destinationVC.tipValue = String(setValue * 100)
            destinationVC.costValue = String(Float(totalCost) * Float((1 + setValue)) / Float(setPeopleNumbers))
        }
    }
    
    func updateUI() {
        //まずはすべてのボタンを未選択状態にする
        zeroPctButton.isSelected = false
        tenPctButton.isSelected = false
        twentyPctButton.isSelected = false 
    }
    
    
}

▼▼▼ResultViewController.swift

import UIKit

class ResultViewController: UIViewController {
    
    //紐付け
    @IBOutlet weak var totalLabel: UILabel!
    @IBOutlet weak var settingLabel: UILabel!
    
    var peopleValue: String? //設定数値(人数)
    var tipValue: String? //設定数値(パーセンテージ)
    var costValue: String? //計算結果
    

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //計算結果の数値、テキスト情報を変える。
//        settingLabel.text = "Split between \(String(peopleValue!)) people, with \(tipValue ?? "0%") tip."
        settingLabel.text = "人数は\(peopleValue ?? "0")人。 チップは\(tipValue ?? "0")%。"
        
        totalLabel.text = costValue
        
        
    }
    

    @IBAction func recalculatePressed(_ sender: UIButton) {
        //画面を閉じるボタンを押したら画面を閉じる時のコード
        dismiss(animated: true, completion: nil)
    }
    
}

##感想
複数の画面に遷移する方法がわかった!これでもっとできることが増えた!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?