2010-01-31 58 views
1

在winforms/C#中,大多數所有的UI控件都有一個.Tag標籤,就像myButton.Tag = myObject; Tag屬性是一個'對象'類型,所以你基本上可以存儲任何類型的對象。我該如何在Objective-C/Cocoa中完成這項工作?做所有的UI元素都有類似.Tag的地方我可以存儲一個NSObject或什麼的?如果是這樣,你能舉個例子嗎?非常感謝!我可以在Objective-C中的按鈕內存儲自定義對象嗎?

注:我看到整數.Tag那裏,但我想要一個對象標記。但我想這不存在。好吧。

+0

是什麼對象呢?這可能有助於確定是否有比嘗試將它與用戶界面控件關聯的更合適的解決方案。 – dreamlax 2010-01-31 22:07:02

+0

我希望按鈕有一個值和一個標識符。如果我使用.Tag作爲標識符,我將無法在其上存儲值。基本上,我只需要更多的信息存儲在按鈕。 – foreyez 2010-02-01 02:00:04

+2

一個按鈕不應該有一個值;其目的是調用一個動作,而不是存儲一些任意的數據。 – dreamlax 2010-02-01 03:43:28

回答

1

有可能添加標籤,如果我沒有記錯,它是一個整數。

這就是說,我非常確定在Cocoa中從來不需要這個功能,因爲它不會以這種方式工作。

如果您確實想要添加信息,您可能會對運行時的能力to associate an object with another object感興趣。

+0

您可以將此與分類結合使用來爲NSControl定義objectTag屬性,該屬性將通過固定的「ObjectTag」鍵將任何一個對象與控件相關聯。 – 2010-01-31 22:13:18

+0

要小心:聯想參考僅在3.1+(如果只有3.0有他們)可用 – rpetrich 2010-01-31 23:59:20

+0

我喜歡肯德爾的答案。 – foreyez 2010-02-01 03:07:43

1

NSControl確實有tag和相關的setTag:方法。它不是內部使用的,所以你可以存儲任何你喜歡的東西 - 它只存儲NSInteger值。

所有Cocoa控件都從NSControl繼承。

+0

Just'tag'(no colon):) – dreamlax 2010-01-31 22:12:30

+0

@ cb160:UIKit與AppKit不同,儘管所有'UIView'-s都具有'tag'屬性。 – kennytm 2010-02-01 06:45:46

5

正如喬治說,可以關聯的任何對象使用Objective-C運行,所以你可以,如果你真的想要一個對象,以控制關聯的另一個對象。

但這並不是真正的標準Cocoa程序的工作原理。相反,在Cocoa中,模型 - 視圖 - 控制器模式和委派是標準習慣用法,並且不鼓勵將對象直接關聯到窗口小部件或視圖。即使是一個很小的程序,你至少會創造出管理數據模型 - 控制器(通常稱爲的申請委託可可行話),並保持標準控件是組成的視圖。然後視圖和模型控制器通過目標/動作和委託進行交互。

蘋果對Cocoa中流行的設計模式有很好的討論,參見here

一般地,當從一個API(的Winforms/C#)到另一API(可可/目標-C)移動,也有一些相似之處,但也存在一些差異。通常值得學習如何在API中完成任務,而不是試圖讓自己習慣了新事物。 (只是要清楚,我不是說這是API本身好;這次討論是雙向的!)

所以,當你在一個情況:

要在API AX,我知道成語P作品。我現在想要做的X在API B。如何在API B中直接實現成語P

我建議你要問

要在API BX,我該怎麼辦? API B中的成語是什麼?

改爲。

1

CALayer s有能力存儲任意鍵作爲他們的鍵值編碼機制的一部分。例如:

CALayer *myLayer = [button layer]; 
// Storing a value 
[layer setValue:@"World!" forKey:@"hello"]; 
// Retrieving a value 
NSLog(@"Hello %@", [layer valueForKey:@"hello"]); 

這就是說,存儲針對用戶界面元素的對象違反了模型 - 視圖 - 控制器模式的原則;我會建議反對它 - 一個UIViewUIControl子類可能會更適合。

1

是的。如果你喜歡,你可以添加自己的財產到所有UIControls。 只需將以下內容添加到您的代碼中即可。

#import <objc/runtime.h> 

/* -------- The Following Code adds an objectData property for every UIControl ----------- */ 
@interface UIControl (UIControlAdditions) 
@property (nonatomic, retain) id objectData; 
@end 

static char const * const ObjectDataKey = "MyObjectDataKey"; 

@implementation UIControl (UIControlAdditions) 
@dynamic objectData; 
-(id)objectData { 
    return objc_getAssociatedObject(self,ObjectDataKey); 
} 
- (void)setObjectData:(id)newObjectData { 
    objc_setAssociatedObject(self, ObjectDataKey, newObjectData, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 
@end 
/* -------- The Above Code adds an objectData property for every UIControl ----------- */ 

貸奧萊Begemann:http://oleb.net/blog/2011/05/faking-ivars-in-objc-categories-with-associative-references/

相關問題