2

在使用django大約兩年後,我開始嘗試iPhone開發。由於我已經完成了教程和閱讀文檔,因此在iPhone開發中使用的各種庫引起的不便之處在於爲數據模型創建用戶輸入表單時所需的重複次數。在Objective-C中生成模型(a la django模型框架)

我知道有兩種常規的方法對用戶輸入表單的創建:

  1. 創建對模型類與屬性對應的基團在界面生成器UITextFields,並將它們連接起來,相應IBOutlets上的自定義表格控制器。

  2. 在具有自定義表單視圖控制器類的表中使用UITextFields以編程方式創建窗體視圖。該類保存與數組中模型屬性相對應的名稱列表,然後迭代該數組以爲每個表格單元格創建UITextFields。使用特殊的外殼,以確定哪個模型屬性上迭代,並利用這些信息來創建表格單元格對應的UILabels和UITextFields。*

兩中,只有第一個似乎是迭代開發的第二個實際是痛苦的詳細和非常困難(對我來說)閱讀。藉助Objective-C的內省功能,似乎可以編寫接受模型類作爲參數的代碼,並在運行時從該信息生成表單控制器(甚至可能是表單視圖)。

所以我有三個問題:

  1. 是否有常規替代方法來創建表單視圖和控制器比這兩個我上面列出的其他車型?我不喜歡我在那裏列出的任何一種方法。

  2. 是否可以在Objective-C中自動生成表單控制器/視圖,或者我只是在咆哮錯誤的樹?

  3. 這樣的自動生成已經嘗試或完成了嗎? (有點谷歌搜索卻一無所獲)

*我給這家主要參考來自實例#6在第9章:導航控制器和Apress出版的表格視圖‘Beginning iPhone 3 Development

回答

1

我工作了同樣的問題,現在,在我來說,我有一個複雜的一套由WSDL來款,而且也可以改變不時表單元素的很多。我絕對不想在代碼或IB中手動完成這些表格。

Objective-C是一種完全動態的語言,你完全可以做到你想要的完全動態的方式。假設你的模型是核心數據模型,你可以使用類似[[myCoreDataObject entity] propertiesByName]的東西來找到所有的屬性。然後,您可以通過這些屬性自動創建適當的表單字段,具體取決於它們的類型。

然後,您將創建一個例如UITableViewController的子類,它將一個NSManagedObject傳遞給它,它將自動創建一個與模型對象相匹配的窗體。

0

好像你的努力像Django網站一樣編寫iPhone應用程序,但兩者完全不同。

這裏是MVC的可可的簡要介紹:

  1. 寫您的模型類獨立於任何控制器或視圖
  2. 的編寫存儲模型類作爲重點控制器(例如 - [myController的模型]和 - [MyController setModel:])
  3. 打開界面構建器並設計您的視圖。使用控制器中的綁定或代碼使視圖與模型交互
+0

我描述了兩種創建數據輸入表單的方法,以便進入模型。我不確定你寫在這裏的內容與我在#1中描述的有什麼不同。 – Prairiedogg 2009-07-04 16:31:52

+1

「將一個模型類的屬性重新聲明爲一組UIView子類」聽起來好像將UIView子類放入模型中一樣,這是執行此操作的錯誤方法。我認爲你的問題不夠清楚,無法得到你想要的答案。 – 2009-07-05 03:33:15

+0

謝謝湯姆,我已經編輯了我的問題一點,你說的正確,它原來不夠清楚。 – Prairiedogg 2009-07-06 15:27:06

0

請記住,像Django這樣的系統基於完全腳本化的環境。語言結構可以在執行過程中多次動態創建,解釋和重新解釋。

像頁面正在發送到客戶端/瀏覽器時,像業務規則和表單邏輯的概念可以從字面上寫。

對於編譯語言,所有這些移動部分必須預先創建並完全解析(大部分)。大多數經典的基於UML的源代碼或基於模板的系統都是複雜的龐然大物,它們產生了非常難以使用的代碼。

像Cocoa和Carbon這樣的MVC模型和庫,儘管可能不像Django中可能的技術那樣「優雅」,但確實圍繞解決一些相同挑戰的需求而演變。

儘管存在其他替代方案,例如將Objective-C與解釋型語言(如LUA或Python)結合是可行的。還有幾個開源項目專注於構建完全動態的「無線」用戶界面客戶端,這些客戶端位於基於服務器的系統之上,該系統廣播關於界面外觀和行爲方式的詳細信息。 (我找不到該項目,但會在我編輯時編輯)

我不知道這方面的任何主要工作,並且懷疑大多數普通iPhone應用程序的範圍或程度都不夠複雜的可變性來保證創建這些自動化系統的努力。

很少用戶界面是iPhone應用程序的複雜部分,也許除了一些獨特的遊戲外。

巴尼

0

這些是解決同一問題的兩種方法,實際上,兩者都不是比另一種更爲正確。你當然可以很容易地做第一個 - ObjC是一個完全動態的語言。

但是,我個人建議不要「打架」。就像Django中的#2路線是完全可能的一樣,框架並不是圍繞這種方法構建的,最終你會寫很多代碼,否則你就不必編寫代碼。

可可的方法 - 路線#1 - 當然有其優點。我強烈建議給它一個機會。