期中測驗-Swift UIKit iOS App 入門測驗 1-中英選擇題App

Jim
彼得潘的 Swift iOS / Flutter App 開發教室
7 min readApr 28, 2022

打鐵趁熱花了快四五天終於慢慢了解傳資料的皮毛了,終於可以來做這個好玩的測驗啦~~

先看看成品!

期中作業功能需求

  1. 製作選擇題 App,每題有四個選項。
  2. 答對一題加 10
  3. 畫面上顯示目前題目是第幾題。
  4. 自訂選擇題的資料型別。
  5. 題庫有 n 題,隨機出其中的 10 題,每次玩的時候題目順序都不一樣。( n > 10 )
  6. 包含多個頁面,至少有問題頁面和分數頁面。
  7. 利用 IBSegueAction & performSegue 將結果從問題頁傳到分數頁。
  8. 使用 UIAlertController 顯示 alert

App架構介紹

Storyboard

  1. 總共有兩種遊戲測驗可以玩,遊玩者可根據想玩的遊戲切換至不同頁面
  2. 遊玩結束時,可以根據使用者答對幾題得幾分且顯示至同一頁面

Code

這裡我主要講資料的設定,相關的Code以及邏輯可以下載我的Github裡面有完整註解!!

以下總共有四個Controller以及Model類型跟QuestionData(資料)

QAModel:文字題目以及進行遊戲的兩個類別

EnglishQuestion:遊戲所需資料

ChineseQuestion:遊戲所需資料

QuestionStruct:定義我們需要的資料型別

Controller

這裡說明ChineseCtroller跟EnglishController一樣最後都會顯示結果跳轉至ResultCotroller,所以我就介紹ChineseCtroller&ViewController&ResultController。至於EnglishController跟ChineseCtroller的Code一樣。

viewCtroller:

設定兩個Button:

chineseButton

englishButton

viewCtroller->Code:

  1. 利用enum列舉出題目類型(中文&英文)
  2. 設置資料: CHQuestionData(),ENQuestionData(),[Question]()

拉SegueAction->

將問題資料分別傳入至ChineseController&EnglishController

每次資料傳給下一頁時,removeAll()淨空,避免累加

https://medium.com/%E5%BD%BC%E5%BE%97%E6%BD%98%E7%9A%84-swift-ios-app-%E9%96%8B%E7%99%BC%E5%95%8F%E9%A1%8C%E8%A7%A3%E7%AD%94%E9%9B%86/%E5%B0%87%E6%BB%BF%E8%B6%B3%E6%9F%90%E6%A2%9D%E4%BB%B6%E7%9A%84%E6%9D%B1%E8%A5%BF%E5%85%A8%E9%83%A8%E7%A7%BB%E9%99%A4%E7%9A%84-removeall-where-swift-4-2-30defc5ac6c2

fuuc ->

將問題隨機打散shuffle()

https://medium.com/%E5%BD%BC%E5%BE%97%E6%BD%98%E7%9A%84-swift-ios-app-%E9%96%8B%E7%99%BC%E5%95%8F%E9%A1%8C%E8%A7%A3%E7%AD%94%E9%9B%86/swift-4-2-%E6%9B%B4%E6%96%B9%E4%BE%BF%E7%9A%84%E4%BA%82%E6%95%B8-random-function-85fa69a08215

ChineseCtroller:

選擇問題按鈕Button : optionsButton

得分Label: score(Int)

得分:Label

問題:Label

問題題號:questionNumberLabel

問題題目:questionLabel

ChineseCtroller->Code:

這裡最重要的是接收viewController裡的資料,並且抓取QAModel裡的Game

viewDidLoad()裡的code

updateQuestion()&updateUI是func我獨立寫出來在QAModel裡,因為每次回答完都需要更新,所以我就綁在一起!

Action->optionsButton(四個選項)

每次回答完都會告訴(alert)遊玩者是否答對,若答錯顯示(alert)出正確答案

使用Button屬性的tag來判斷array[]是否為真,若為真則分數+10分

並alert出遊玩者,若回答完10題則結束遊戲並透過segue跳轉至ResultController

拉IBSegueAction->

跳轉之後接收分數至ResultController

func->alert()

ResultCtroller:

score:Label

score(Int):Label

Result(String):Label

Button:重新測驗

ResultCtroller->Code

之後EnglishController跟Chinese一樣我就不多介紹啦!!

最後附上GitHub:

--

--