2010-07-21 49 views
0

我是一個相對的Objective-C noob,所以請耐心等待。 Apple文檔指出,讓兩個視圖控制器控制單個視圖並不是一個好主意。可以繼承一個視圖控制器嗎?

我正在構建一個遊戲,發生在一個單一的視圖。我想創建可以將自己添加到主視圖的對象(作爲子視圖)。可以將這些對象創建爲視圖控制器子類,還是必須創建對象作爲NSObject的子類,並處理視圖控制器中的所有視圖和子視圖?這是我現在正在嘗試做的,但它正在變成一個結構混亂...

回答

0

你的子視圖不應該是UIViewController的,而是UIView的。

0

是的,你幾乎總是需要繼承視圖控制器來處理視圖的細節。視圖中的對象應該是UIViews或其子類。

0

你想要一個UIViewController的子類來管理整個屏幕。該控制器的視圖可能會成爲所有事情的一個大容器。如果你想要其他控制器,只需爲它們創建NSObject的子類,並讓它們各自擁有自己的UIView(這是主控制器視圖的子視圖)

沒有UIViewController的多個子類在同時。你會得到各種古怪的行爲,因爲這是一個不受支持的設置。

2

像這樣的遊戲設計的重要部分是確保您將大部分邏輯放在遊戲的數據模型中,而不是視圖控制器或視圖中。數據模型應該跟蹤對象在遊戲空間中的位置,應該具有哪些邏輯屬性和視覺屬性,以及它們是否與其他遊戲對象交互。

視圖控制器的功能應該僅僅是將每個對象的邏輯轉換爲視圖。視圖的唯一功能應該是虛擬繪製任何控制器告訴它的內容。

例如:假設你有一個簡單的遊戲,其中兩個球從牆壁或彼此反彈。當他們碰撞另一個球時,他們會改變顏色。數據模型中的每個球和每個牆將由一個單獨的對象表示。每個對象都將負責在任何給定時間對球/牆的狀態進行建模,並確定其位置以及是否發生碰撞。

換句話說,數據模型應該處理除了實際顯示之外的所有關於遊戲的內容。原則上,數據模型應完全獨立於任何特定的顯示。你應該能夠在標準視圖,web視圖甚至命令行上玩遊戲。

視圖控制器的作用是將遊戲對象的邏輯位置和邏輯狀態轉換成遊戲畫面上的子視圖。例如。使用UIImageView顯示球的圖像。視圖控制器只是簡單地告訴視圖使用特定的圖形在屏幕上的特定位置繪製一個球。而已。隨着數據模型的改變,視圖控制器會改變繪製的內容,但它不記得上一次繪製的內容,以及接下來繪製任何內容的地方。它只是反射數據模型。

要處理用戶輸入,它會將將UI更改轉換爲數據模型輸入的過程相反。但是,視圖控制器不會計算這些輸入的結果或後果。這是數據模型的工作。

通過將遊戲的所有複雜邏輯放入數據模型中,您可以輕鬆更改視圖控制器/視圖對以及添加,刪除或修改許多不同的視圖。例如,您可能在iPhone,iPad和Mac上擁有相同的遊戲。大多數代碼在所有三個平臺上都是相同的,但每個代碼都具有自定義視圖控制器/視圖對。

模型 - 視圖 - 控制器非常重要,隨着應用程序複雜性的增加,它越來越重要。在您嘗試擴展應用程序時,很容易在控制器或視圖中塞入大量的數據和邏輯,從而導致它們超載並造成相互關係的混亂。先寫數據模型。使數據模型能夠僅用文本輸入來播放整個遊戲。然後,只有這樣,才能連接圖形界面。如果遵循這種模式,編寫圖形元素將會非常簡單並且非常靈活。

+0

非常感謝這樣詳細的答案!非常感激。 – Marc 2010-07-21 17:41:16

0

我想象你正在寫一個吃豆子游戲,你的目標是使用主視圖作爲迷宮和這些子視圖來表示你的遊戲角色。

表示這種混合的一種方法是使用一個視圖控制器(從UIViewController分類)來控制所有視圖。這是完全合法的。所以你的一個視圖控制器負責你的主視圖(迷宮)和子視圖(角色)。

然而,我會建議你使用Core Animation來處理這種情況,並將所有東西都當作圖層處理。這樣,您只有一個視圖支持所有圖層,並使用一個負責管理字符位置和用戶輸入的控制器。它應該大大簡化你的生活。

相關問題