#11日目のアプリ
チップ計算アプリで、segueを学ぶ
##以下の流れで作りました。
- 画面を2つ用意する。
- 各画面にオブジェクトを配置して、Viewcontrolerに紐付け
- stepパーツ、テキストフィールド入力、選択ボタンで入力する数値を取得
- 計算結果を別のView に表示するようにsegueを設置
- 数値を受け渡す。
##できたこと
- テキストフィールドに入力した内容を取得して利用
- 別画面に値を渡す
- 別画面を閉じる。
##書いたコードを共有します!
▼▼▼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)
}
}
##感想
複数の画面に遷移する方法がわかった!これでもっとできることが増えた!