2012-11-19 31 views
1

我對OOP並不是很有經驗,所以我想分享我目前正在做的事情,並要求提供一些關於如何去做幾件事的建議。Objective-C:重構代碼 - 如何獲取指向視圖實例的指針?

我目前正在使用2d網格的簡單遊戲。以下是我的班級結構快速概覽:

  • 'GameBoard'具有遊戲的可能單元狀態數組以及實現規則的方法。
  • 'GameView' - 擁有超類NSView,並作爲自定義視圖放置在我的窗口中。這個類打算從遊戲板上讀取數據,並通過將凝視映射到drawRect:方法中的枚舉圖像來繪製數組的內容。
  • 'GameController' - 這是一箇中級類,用於初始化遊戲板和視圖,並處理各種UI控件。這個類有'GameBoard'和'GameView'類型的實例變量。

本來,我是做在View類幾乎一切,本來它的工作不錯,但它開始變得實在難以遵循,這是我的希望在一個新的類傳播我的代碼主要原因。

我在'GameController'中創建了一個方法,用一些用戶定義的參數(在片段中刪除以節省空間)初始化新遊戲。

-(IBACTION)initialiseGame:(id)sender { 
    gameBoard = [[GameBoard alloc] init...]; 
    gameView = [[GameView alloc] init...]; 
} 

我想在這裏做的是通過遊戲顯示的指針遊戲板實例,這樣我可以讀取它的陣列來繪製遊戲的當前狀態,是這樣的:

-(void)initWithGameBoard:(GameBoard*)gameBoard; 

這是否是正確的方式去做,或者我應該以不同的方式做到這一點?

我轉移到控制器類的下一個問題是,我似乎無法找到如何獲取指向我在IB窗口中放置的GameView實例的指針?最好不要將視圖放在界面構建器的窗口中,而是將其放置在窗口中以編程方式在initialiseGame函數中?如果是的話,我會怎麼做呢?

我想另外一個問題是,我是否應該放棄這個想法並堅持在GameDraw類中做所有事情?

非常感謝您花時間閱讀本文,這對任何有經驗的面向對象程序員來說可能都是一個非常簡單的問題,但我似乎無法在任何地方找到答案。

+0

第一個問題:是的,我通常會使用它本身調用其超類的初始化方法定製initWithSomething init方法。 –

+0

第二個問題。請更具體一些或提供更多的代碼。你的GameController是UIViewController的一個子類嗎?或者它是一些從任何View中分離出來的NSObject? Plus:您使用Interface Builder(IB)還是以編程方式創建所有視圖對象? –

+0

嗨,謝謝你的回覆。 GameController類目前只是NSObject的一個子類。我使用IB來創建所有UI對象,並將GameView添加到窗口中。是否有可能獲得指向窗口上的實例的指針,或者我應該以其他方式做這件事? – tom1990

回答

3

有這樣做,使這項工作的方法不止一種,但這裏是我會怎麼做:

  1. 在IB一次實例化視圖。不要自己調用alloc/init。
  2. 在您的視圖控制器中,爲您的視圖創建一個插座並將其連接到Interface Builder中。這就是你的控制器可以訪問它的方式。您的視圖控制器將需要成爲文件所有者 - 可能它已經是。
  3. 將視圖設計爲可重用。給它一個-setGameBoard:方法供控制器調用。確保視圖可以在沒有遊戲板時畫空白。
  4. -initializeGame:這樣的:

    -(IBAction) initialiseGame:(id) sender { 
        gameBoard = [[GameBoard alloc] init...]; 
        [gameView setGameBoard:gameBoard]; 
    } 
    
+0

請注意,您可以創建一個合成的'gameBoard'屬性,併爲您創建適當的訪問器方法。 – Chuck

+0

當然,雖然'-setGameBoard'可能也應該調用'-setNeedsDisplay:'觸發視圖重畫。 – paulmelnikow

+1

@noa感謝您的回答,現在就開始工作吧!該解決方案非常簡單 - 這與將任何標準UI對象連接到代碼相同。我認爲讓我困惑的是我正在與一個自定義類進行合作。我沒有意識到你可以爲自定義類創建一個IBOutlet!我想我明白當你用IBOutlet鏈接某些東西時會發生什麼......它基本上只是設置了伊娃指針,以便在加載窗口時引用由筆尖創建的對象的實例。如果我的理解是正確的! (我是一個初學者到OOP,所以我還沒有完全清楚!) – tom1990