簡體   English   中英

什么描述Objective-C和Cocoa Bindings最好?

[英]What describes objective-C and Cocoa Bindings best?

我無法理解Cocoa綁定。 有人能以一種人類可感知的方式向我解釋這是什么嗎?

綁定是一個系統,用於將視圖連接到控制器,而無需編寫大量的粘合代碼,以使它們明確地相互通信。 您所要做的就是在兩個類中設置屬性*並在IB中連接綁定。

傳統方法是視圖具有一個或多個與控制器通信的出口(最通用的示例是delegatetarget ),並且控制器具有與視圖對話的出口。 當控制器更新模型時,它會發送(例如) [view modelChange:newModelObject] 當視圖想要更新模型時,它會向其委托(控制器)發送一些委托消息,例如NSText的textDidChange: .

使用Bindings,您在代碼中所要做的就是在視圖上實現屬性並在控制器上使用屬性,然后將視圖的一個或多個屬性公開為綁定*。 然后你只需要掛鈎綁定。 如果它是一個Cocoa類,那就是蛋糕:只需在IB中設置它。 如果它是您自己的自定義類,您可能會編寫bind:toObject:withKeyPath:options:自己發送消息(並不難)。

讓我重申一下:使用Bindings,你的整個膠水代碼(大部分時間)都是[view bind:@"viewProperty" toObject:self withKeyPath:@"controllerProperty.modelProperty" options:options]; 在控制器中。 其他所有內容都由幕后的Bindings和KVO系統以及您的屬性訪問者處理。

缺點是您必須嚴格遵守Cocoa Bindings的要求。 這些很簡單,但許多舊的應用程序的設計方式不適合Cocoa Bindings。

  • 您必須創建真實的模型對象,而不僅僅是傳遞原始對象(例如,字典數組)。 如果您正在使用Core Data,這很容易:您的托管對象是模型對象。
  • 您必須正確編寫訪問者或合成正確的訪問者。 例如,NSString屬性應始終為@property(copy) ,永遠不要@property(retain) (因為否則,您會發現自己保留了其他人的可變字符串,然后在您持有它時它們會發生變異)。
  • 只能通過屬性( model.foo = bar )或訪問者消息( [model setFoo:bar] )更改模型對象的屬性,而model.foo = bar直接實例變量訪問來[model setFoo:bar] (訪問器方法本身的明顯例外,如果你自己編寫,因為它們必須直接訪問實例變量。)

有兩個好處:

  • 您可以編寫一個全新的視圖類,而無需刪除大量的膠水代碼。 您必須刪除的最多是舊視圖屬性的一些bind::::消息。 如果,在未來的幾年內,您決定當前的視圖無法擴展到您的應用程序即將推出的功能,這使您可以靈活地將其撕掉並以最小的痛苦重新開始。
  • 更重要的是,您需要閱讀的代碼越少,就越容易閱讀它。

*並且,根據文檔,在視圖類中實現KVO觀察方法 ,但我從來沒有真正必須這樣做。 我提交了文檔錯誤

添加2009-03-07:啊,發現了引文。 “NSView子類可以通過為每個屬性調用類方法exposeBinding:來將其他鍵值編碼/鍵值觀察兼容屬性公開為綁定。” - NSKeyValueBindingCreation因此您不需要實現KVO觀察方法。

以前的答案是非常全面和良好的,我只是想我會添加一個答案解釋它的核心是什么而不涉及Cocoa或Objective-C。 這是因為這個概念本身就是語言無關,雖然像Objective-C的動態語言使得它比C ++等多種靜態語言要容易得多

假設你有兩個物體MV. M有方法:

setX(int x);
setY(int y);
int getX();
int getY();

雖然V有方法:

setA(int x);
setB(int y);
int getA();
int getB();

一種看待這種情況的方法是M具有屬性xy,V具有屬性ab 你想屬性x的變化引起性質B的變化和y中的變化引起變化。

通過改變屬性x,我們的意思是:

M.setX(10)

之前的地方

M.getX() != 10

所以我們想在M上調用setX來調用V上的setA

允許您說什么綁定是對象V上的屬性b綁定到對象M上的屬性x 然后自動處理此更新。 作為編碼人員,您不必編寫檢查x是否已更改的代碼,然后在V上調用setB 綁定自動處理這個問題。

摘要

綁定允許您將兩個屬性綁定在一起,這兩個屬性存在於兩個不同的對象上,因此更改其中一個屬性的值會導致另一個對象中的依賴屬性更改為相同的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM