iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 8
0
Software Development

無中生有-從SWIFT語法學習到iOS APP的開發系列 第 8

Day8 - 誰勝誰負

前言

延續上個猜拳App,我們來擴增這個App的完整度,來新增玩家名稱、判斷輸贏。

所以這次要用到的東西有:

  • Text Field:用來輸入玩家姓名
  • Navigation Controller:因為我設計的大小是連iPhone SE也能正常顯示,版面已經非常緊繃,所以輸入玩家姓名的頁面我放到另外一個View Controller,為了讓比賽頁面可以返回輸入姓名頁面,這次選用swift原生的Navigation Congtoller
  • segue:利用segue來切換頁面,同時將玩家姓名拋轉到比賽頁面

1.新增一個View Controller

從元件表直接拖曳一個View Controller進Main.storyboard

2.新增一個Cocoa Touch Class檔案

將檔案命名為"ReadyToStartVC",繼承UIViewController,語言當然是選swift


3.指定新創建的View Controller的Class

點選新建立的(ReadyToStartVC)View Controller,並在右側"Identity"頁面選擇剛剛的檔案"ReadyToStartVC"

4.加入Navigation Controller

點選新建立的(ReadyToStartVC)View Controller,接著在上方工具列點選"Editor/Embed In/ Navigation Controller"

加完之後,Main.storyboard就變成這樣

5.將Navigation Controller設為Initial View Controller

點選Navigation Controller接著在右側"Attributes"屬性頁面將"Is Initial View Controller"打勾

Main.storyboard中可以看到起始箭頭移到Navigation Controller了

6.將需要的元件加入View Controller

7.變更導覽列名稱

點選(ReadyToStartVC)View Controller上放灰色色塊,接著在右側"Attributes"屬性頁面設定Title

8.連結兩個View Controller

將(ReadyToStart)View Controller中的按鈕按右鍵拉藍線拉到(rps)View Controller,出現選單後選擇"Show"

9.為連結線定義名稱

點選兩個View Controll中間的連結線,並在右側的"Attributes"屬性頁面中為此segue定義名稱segue_home_to_rps

10.在(rps)View Controller中

新增一個Label,拖曳藍線到View Controller.swift中,取名為winnerLabel,另外也將player1 & player2的label拖曳藍線加入View Controller.swift。

加入之後在新增兩個變數name1 & name2,這兩個變數將用來存放玩家名稱

    @IBOutlet weak var player1Name: UILabel!
    @IBOutlet weak var player2Name: UILabel!
    @IBOutlet weak var winnerLabel: UILabel!
    
    var name1: String? = nil
    var name2: String? = nil

11.在(ReadyToStartVC)View Controller中

將兩個Text Field拖曳藍線到ReadyToStartVC.swift中

    @IBOutlet weak var player1TextField: UITextField!
    @IBOutlet weak var player2TextField: UITextField!

實作prepare(for:sender)函數

這是一個當segue啟動時會呼叫的函數,透過參數segue的destination屬性就可以得到下一個View Contorller(亦即rps的View Controller)的實體。

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "segue_home_to_rps" {    //確認我們的動作頁面是切到rps View Controller
            let rps_VC = segue.destination as! ViewController //向下轉型
            if player1TextField.text == "" {
                rps_VC.name1 = "player1"
            }else {
                rps_VC.name1 = player1TextField.text
            }
            if player2TextField.text == "" {
                rps_VC.name2 = "player2"
            }else {
                rps_VC.name2 = player2TextField.text
            }

其中我們宣告了一個rps_VC向下轉型成(rps)View Controller,以便我們調用該檔案裡面的name1 & name2變數

let rps_VC = segue.destination as! ViewController //向下轉型

12.回到(rps)View Controller中

在func viewDidLoad()中加入

player1Name.text = name1
player2Name.text = name2

這樣玩家名稱就可依照輸入的字串顯示在畫面上

13.判斷輸贏

每次按下start按鈕後,會重新比賽,也會決定輸贏,因此我們將輸贏的判斷方法寫在@IBAction func start(_ sender: UIButton)中

let checkWinner = (player1Index, player2Index)
switch checkWinner {
        case let (x, y) where x == y:
            return winnerLabel.text = "平手"
        case (0, 1):
            return winnerLabel.text = "\(name1!)獲勝"
        case (0, 2):
            return winnerLabel.text = "\(name2!)獲勝"
        case (1, 0):
            return winnerLabel.text = "\(name2!)獲勝"
        case (1, 2):
            return winnerLabel.text = "\(name1!)獲勝"
        case (2, 0):
            return winnerLabel.text = "\(name1!)獲勝"
        case (2, 1):
            return winnerLabel.text = "\(name2!)獲勝"
        case (_, _): return
        }

判斷邏輯很簡單,因為我們是用索引值取出rps = ["paper", "rock", "scissors"]中的值,也就是0 = paper,1 = rock,2 = scissors,我這邊先將兩個索引值存入一個叫checkWinner(x, y),藉由Switch去判斷誰贏。


上一篇
Day7 - 來猜拳吧
下一篇
Day9 - 戰績表
系列文
無中生有-從SWIFT語法學習到iOS APP的開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言