2016-05-17 13 views
1

這似乎應該有一個簡單的答案,並且可能的確如此,但它比我預期的要難得多。作爲一個具體的例子,假設我正在編程一個國際象棋遊戲。UIView如何訪問數據模型以顯示數據(使用Swift)?

  1. 好像這是我應該能夠使用CoreGraphics中做而已。似乎使用OpenGL或SpriteKit應該沒有必要。
  2. 我想要一個Board類來模擬電路板的狀態。我應該在哪裏宣佈我的董事會對象?我的印象是它應該在ViewController中。
  3. 我想有一個視圖(實際上是一個子視圖),顯示板的當前狀態(通過重載drawRect)。它應該在開始的時候這樣做,並且在球員進行移動時應該更新。視圖如何訪問數據模型以顯示板狀態?給視圖引用數據是否違反MVC?如果不是,該參考如何傳遞給視圖? (我似乎只是發現了兩個ViewController之間傳遞數據的很多鏈接。)
  4. 它應該是ViewController在需要繪製時將數據「推」到視圖嗎?但我的理解是,不應該直接調用drawRect,而應該調用setNeedsDisplay,這將間接導致drawRect被調用。在這種情況下,很難看到數據如何傳遞。
+0

您的視圖控制器應發送事件或移動到您的董事會視圖。像'movePiece(somePiece,fromSquare,toSquare)''。然後,您的觀點將適當反映這些變化;動畫或任何動畫。視圖控制器不會調用setNeedsDisplay或drawRect;視圖會根據視圖控制器的需要調用這些視圖 – Paulw11

回答

1
  1. 您的代碼;你的設計決定。這裏沒有評論。

  2. 你應該在ViewController中有你的模型聲明。真正。這就是MVC的工作原理。

  3. 參考UIView中的數據DOES break MVC。你的視圖實例將不再是獨立的。解耦視圖和模型是MVC的主要觀點之一,你可能會用這種設計來打破它。

你能做些什麼呢?

擴展@ Paulw11的評論,在您的視圖控制器,你可以聲明看起來像這樣的方法:

func movePiece(somePiece : Piece, toSquare : Square) { 
    let pieceID = somePiece.id //I am just assuming the models structures 
    let pieceImageView = self.pieceImageViewFromID(id) //Assume that this method returns the reference of the image view. Assume that I am just working UIKit here. 
    let fromPoint : CGPoint = somePiece.origin 
    let toPoint : CGPoint = toSquare.coordinates 
    self.animateView(pieceImageView, fromPoint:fromPoint, toPoint:toPoint) 
} 

注意,在這個設計中,視圖不持有任何模型引用;視圖控制器將負責設置其狀態並引入相關的動畫。

  • 如果您正在覆蓋drawRect:,那麼,它被調用,你應該叫setNeedsDisplay更新變化。視圖控制器可能會調用,或者您可以添加屬性觀察器來根據屬性更改重繪自己。這種情況的一個例子是:

    class SillyView : UIView { 
    
        var drawPonies : Bool = false { 
         didSet { 
          if oldValue != drawPonies { 
           self.setNeedsDisplay() 
          } 
         } 
        } 
    
    
        override func drawRect(rect: CGRect) { 
         if drawPonies { 
          self.drawGoodLookingPony() 
         } else { 
          self.drawSomeOtherAnimal() 
         } 
        } 
    
        func drawGoodLookingPony() { 
         //Draw a good looking pony here 
        } 
    
        func drawSomeOtherAnimal() { 
         //Draw Something else 
        } 
    } 
    
  • 如果您的視圖控制器決定提請小馬所有你需要做的是,讓SillyView的基準,並設置drawPoniestrue

    self.sillyView.drawPonies = true 
    

    你是不是路過此地你的數據模型,但配置信息重要的部分,這將有助於該視圖重繪自身。

    +0

    爲了重新繪製板,您不必知道板的整個當前狀態 - 而不僅僅是最最近的舉動?我認爲這個觀點可以跟蹤它被告知的動作,但似乎它會再次打破MVC。 @ Paulw11 – timothy

    +0

    不需要。它不必是那樣的。 ViewController可以爲你管理電路板的狀態。 – avismara

    +0

    但是當視圖執行drawRect時,它會重新繪製視圖中的所有內容,是嗎?如果它不知道這些位置是什麼,它如何重新繪製所有棋子的當前位置? drawRect不會重新繪製所有東西,所以相反,我只是對現有繪圖進行編輯? – timothy

    相關問題