2010-03-17 16 views
0

我有一個強大的j2ee背景,我試圖移動到一些桌面/ iphone編程的objective-c。MVC與可可/ objective-c

我用了很多java web框架來記住mvc,spring和struts ecc ...所以我習慣了將servlet或控制器傳遞給jsp頁面的屬性,這是視圖。 在帶有jstl的jsp頁面中,您可以調用此屬性並渲染爲視頻。 通過這種方式,控制器和視圖(理論上)明顯分開。

使用xcode,我可以輕鬆識別控制器和使用IBuilder構建的視圖。 我發現的所有教程都顯示了直接更改標籤或文本字段的控制器。

所以我的兩個問題:

  1. 在我看來,有兩個(控制器和視圖)之間沒有分離,在那裏我錯了嗎?
  2. 有沒有一種方法讓控制器以j2ee的方式將所有對象打包在一種上下文中並讓視圖讀取上下文?

感謝 萊昂納多

回答

0

在大多數的您已經閱讀例子,你可能看到的是這樣的:

[myTextfield setStringValue:myString]; 

現在在這種情況下確保控制器直接更新文本框,然而由於myTextField將通常是一個IBOutlet它可以是任何在你看來的文本字段,甚至無。很可能它甚至不需要知道它是一個NSTextfield,它只是響應一個setStringValue方法。在這個意義上,控制器和視圖之間是分離的。

現在在上面的評論中,你關心的是MVC中的職責分離,但沒有提到這個模型。使用Cocoa綁定,您可以直接綁定到模型keypath,在這種情況下,模型neeed根本不知道任何關於視圖的信息。

MVC是一個含糊不清的概念,沒有硬性定義。對不同的人可能意味着不同的事情。對我而言,這意味着該視圖具有控制器的知識(通過插座或綁定)有限的模型知識(通過綁定)。控制器對模型有充分的瞭解,並且對視圖的知識有限(通過網點)。最後,該模型對視圖沒有任何瞭解,理想情況下對控制器沒有任何瞭解。

關於你的第二個問題,我不使用j2ee,但我認爲你可以通過讓控制器更新上下文ivar(可能是一個NSDictionary)來實現你想要的,然後在你的視圖中綁定到這個上下文的keyPath。然而,沒有真正的需要包裝所有綁定是非常versitile,你可以綁定到任何財產。

1

我不明白你的第二個問題(我從來沒有用過J2EE),但我想我能取得一些進展回答你的第一個。

可可不強制MVC;它只是強烈鼓勵它 - 特別是對於大型項目。考慮一個示例程序,它有一個綁定到NSArrayController的NSTableView。在這種情況下,NSTableView顯然是視圖(名稱中包含「view」一詞),而NSArrayController顯然是控制器(它的名稱中包含「controller」一詞)。

該模型是NSArrayController知道的NSArray,但您可能不直接與該模型進行交互。您將通過向數組控制器(而不是數組本身)發送addObject:和removeObject:消息來讓NSArrayController操縱其模型。

當你這樣做時,NSArrayController將通過綁定實現NSTableView的更改。同樣,你永遠不會要求NSTableView做任何事情。

所以你從不談論視圖,你從來沒有跟模型談過。你想要發生的一切都通過控制器。

MVC。 QED。

當然,也許你的項目工作的方式,視圖應該是它自己的控制器。世界將不會結束,儘管你可能會發現它更難以違背框架。但是,您應該始終嘗試使用最好的方法來完成手頭的工作,而不是堅持某種設計模式的純粹性。