2015-12-29 131 views
3

每當我創建一個IBAction時,我總是必須將AnyObject的默認類型(sender)設置爲唯一的其他選項,它是實際的類類型。爲什麼IBAction類型默認爲AnyObject?

是否有理由讓它始終默認爲AnyObject而不是我明確添加的對象?

我相信我理解了UIObject和AnyObject之間的區別,但我不明白爲什麼AnyObject應該成爲默認值。

+1

可能重複[Anyobject和UIbutton作爲發件人有什麼區別?](http://stackoverflow.com/questions/30475178/whats-the-difference-of-anyobject-and-uibutton-as-sender) – JAL

回答

4

實際上,您可以將IBAction設置爲該對象層次結構中的任何類。例如,如果您有一個名爲YellowButton的類是UIButton的子類,則可以在AnyObject,UIButtonYellowButton之間選擇。

要考慮的另一件事是,你可以有許多對象附加到相同IBAction。而且他們甚至不需要是同一類型的。例如,您可以將UIBarButtonItemUIButton連接到相同的IBAction。如果發件人類型設置爲AnyObject,則只能這樣做。

現在,爲什麼Apple選擇AnyObject作爲默認值,我只能猜測。我認爲這是因爲你可以在你的方法中鍵入發送者而不丟失任何信息。這樣,您甚至可以根據發件人的課程採取不同的行動。

4

我能想到的一個原因就是讓我們先說我寫了一個對象的接口,但我還不知道哪個控件類型會調用該操作。或者更進一步,我最終得到不止一種類型的控制。

通過默認AnyObject它很適合與objc id類型。它也是可擴展的,並且可以用於一般情況。

它也是Target-Action的一部分,因此只有特定的方法簽名必須實施才能工作。

該提取物提供了良好的情況下 -

的senderparameter通常識別控制發送動作消息(儘管它可以是由實際發件人取代的另一個目的)。這背後的想法與明信片上的返回地址類似。如果需要,目標可以向發件人查詢更多信息。如果實際的發送對象將另一個對象替換爲發送者,則應該以相同的方式處理該對象。例如,假設你有一個文本字段,當用戶輸入文本,nameEntered操作方法:調用目標:

- (void)nameEntered:(id) sender { 
NSString *name = [sender stringValue]; 
if (![name isEqualToString:@""]) { 
    NSMutableArray *names = [self nameList]; 
    [names addObject:name]; 
    [sender setStringValue:@""]; 
} 
} 

這裏的響應方法提取文本字段的內容,將字符串添加到作爲實例變量緩存的數組中,並清除該字段。其他可能的查詢發件人會詢問一個NSMatrix對象的選定行([sender selectedRow]),詢問一個NSButton對象的狀態([sender state]),並詢問任何與控件相關的單元的標籤([標籤是數字標識符

默認爲id/AnyObject是有意義的,因爲您可以隨時更改以確保更好的類型安全性。

相關問題