2016-12-24 77 views
-1

這段代碼不是我自己的,我跟着一個YouTube視頻linked here開關玩家在tictactoe

我對以下代碼存在問題,並將其縮小到特定部分和問題。

首先這裏是代碼:

import UIKit 

class ViewController: UIViewController { 

var activePlayer = 1 // cross 
var gameState = [0,0,0,0,0,0,0,0,0] 

@IBAction func action(_ sender: AnyObject) 
{ 
    if (gameState[sender.tag] == 0) 
    { 
     gameState[sender.tag] = activePlayer 

     if (activePlayer == 1) 
     { 
      sender.setImage(UIImage(named: "Cross.png"), for: UIControlState()) 
      activePlayer = 2 
     } 
     else 
     { 
      sender.setImage(UIImage(named: "Nought.png"), for: UIControlState()) 
      activePlayer = 1 
     } 
    } 

} 

的主要問題是,我不明白的遊戲狀態[sender.tag]部分。當我運行程序時,第一次點擊我沒有任何按鈕,下面的點擊就會根據需要放置一個cross.png。 放置第一個十字架後,點擊不會產生任何東西。十字架不會改變,任何空白的按鈕也不會變成十字架或插槽。

在視頻教程中,他指示在[sender.tag]的末尾添加「-1」,像這樣:gameState [sender.tag-1]但是,當我嘗試點擊時會導致錯誤在程序運行時在按鈕上。因此,我刪除了該部分,程序運行,但出現上述情況。

我對編碼一般都很陌生,只是在社區學院完成了C++課程的介紹,現在學習Swift 3作爲一種愛好,所以我可能會錯過一些可以很容易地解釋這種情況的基本信息。

感謝您提前向社區提出這種情況的可能性僅僅基於我的無知,我試着瞭解sender.tag和其他幾天的事情,但現在都無濟於事。我希望我能從這種情況中學習,並感謝任何信息!

+1

我沒有看視頻。但從代碼判斷,您必須將* tags *(1 ... 9)分配給Storyboard編輯器中的所有按鈕。 –

+0

該教程從來沒有經過這一步,它只是爲他工作,但他確實提到他添加的「-1」與數組自從0開始一致...所以如果他有一些idk選項會自動爲按鈕或其他東西編號,但我從來沒有爲按鈕分配標籤,所以我會研究如何做到這一點,並回到你身邊......看起來好像它能夠發揮我目前發現的功能。感謝您的信息。 –

+0

將標籤添加到按鈕後,它可以很好地工作。視頻從來沒有經過這一步...是否有某種選擇在Xcode自動分配標籤到新創建的按鈕,或什麼? 爲了匹配數組集合,我不得不將「-1」加回到sender.tag的末尾,但現在它完美了。非常感謝你提供的信息。 –

回答

0

Martin R.在評論中回答了OP的問題(UIButton標籤未初始化)。我想詳細說明一下標籤,希望它會有所幫助。

iOS/OS X編程中的標記只是分配給視圖的整數標識符。無論您是否使用它,完全取決於您。未設置的標籤默認爲零。

UIControl s及其所有子類(包括UIButton s)都使用目標動作設計模式。該模式通過爲控件分配一個方法(動作),當用戶與控件交互時,該方法在特定對象(目標)上被調用。可以爲控件支持的每種交互類型分配不同的操作方法(例如,按鈕上的觸摸按下操作可以與觸摸操作區分開來)。

當一個操作方法被調用時,它將接收作爲其交互發生的UIControl實例的第一個參數。這個參數通常被稱爲sender(這是有道理的,因爲控制器正在「發送」一個發生某種交互的通知)。

現在考慮九個UIButton s在井字遊戲網格。由於所有按鈕都具有相同的在線行爲,因此讓它們在視圖控制器上分別調用相同的操作方法很方便。在OP的問題中,動作方法實際上是一個叫做action(_ sender:)的函數(更好的是更具描述性的,比如squareTapped(_ sender: UIButton),但我離題了)。

如果按鈕沒有全部調用相同的動作方法,那麼您不得不面對類似upperLeftCornerTapped(),upperMiddleTapped()等功能的噩夢,所有這些都會做同樣的事情。從設計和維護角度來看,這非常醜陋。

但是,這引出了一個問題:既然所有的按鈕調用相同操作方法,我們如何區分按鈕實際上是挖?這是標籤進入的地方。當按鈕被設置時,我們爲每個標籤分配一個唯一的整數標識符。

由於默認情況下標籤爲零,所以必須使用非零標籤值,因此我們保證我們通過標籤識別的視圖是我們明確認爲有效的視圖。

既方便又實用,按鈕索引從1開始並遍歷9.這使我們可以直接將每個按鈕與遊戲狀態變量相關聯。在這種情況下,tag - 1用於從可變的gameState陣列中獲取從零開始的索引。