iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
Mobile Development

麻瓜學習 iOS 開發系列 第 29

Day29: Picker controller

前言

今天要在 RecipeDetailView 中添加 Picker controller,
使其能夠通過選擇不同的份數來顯示不同量的食譜。

實作

  • 在 RecipeDetailView 中 增加 Picker 並選用 segment style

  • 更改 ingredient 數據

    這段 code 就顯示 RecipeDetailView 中的 ingredient 數據,
    因為我們要做一些數學運算才可以得出不同份數的 ingredients,
    因為這些運算在其他地方也可能用到,
    所以放在管理邏輯的 ViewModel 裡。
  1. 宣告 getPortion method
    並宣告為靜態方法:
  2. 進入 RecipeDetailView 修改 ingredients
  3. ingredient portion
    新建一個 group 放入算法:

    具體的計算份量的 function 內容:
static func getPortion(ingredient:Ingredients, recipeServings:Int, targetServings: Int ) -> String {
        var portion = ""
        var numerator = ingredient.num ?? 1
        var denominator = ingredient.denom ?? 1
        var wholePortion = 0
        if ingredient.num != 0 {
            denominator *= recipeServings
            numerator *= targetServings
            let divisor = Rational.greatestCommonDivisor(numerator, denominator)
            numerator /= divisor
            denominator /= divisor
            if numerator >= denominator  {
                wholePortion = numerator / denominator
                numerator = numerator % denominator
                portion += String(wholePortion)
            }
            if numerator > 0 {
                portion += wholePortion > 0 ? " " : ""
                portion += "\(numerator)/\(denominator)"
            }
            
        }
        if let unit = ingredient.unit {
            portion += ingredient.num == nil && ingredient.denom == nil ? "" : " "
            return portion + unit
        }
        
        return portion
    }

修改單位的單複數:

if var unit = ingredient.unit {
            if wholePortion > 1 {
                if unit.suffix(2) == "ch" {
                    unit += "es"
                }
                else if unit.suffix(1) == "f" {
                    unit = String(unit.dropLast())
                    unit += "ves"
                }
                else {
                    unit += "s"
                }
             }
            portion += ingredient.num == nil && ingredient.denom == nil ? "" : " "
            return portion + unit
        }

最後的 view 呈現:


上一篇
Day28:Update the Data and the Featured View
下一篇
Day 30 : DetailView
系列文
麻瓜學習 iOS 開發30

尚未有邦友留言

立即登入留言