每當我創建一個IBAction時,我總是必須將AnyObject的默認類型(sender)設置爲唯一的其他選項,它是實際的類類型。爲什麼IBAction類型默認爲AnyObject?
是否有理由讓它始終默認爲AnyObject而不是我明確添加的對象?
我相信我理解了UIObject和AnyObject之間的區別,但我不明白爲什麼AnyObject應該成爲默認值。
每當我創建一個IBAction時,我總是必須將AnyObject的默認類型(sender)設置爲唯一的其他選項,它是實際的類類型。爲什麼IBAction類型默認爲AnyObject?
是否有理由讓它始終默認爲AnyObject而不是我明確添加的對象?
我相信我理解了UIObject和AnyObject之間的區別,但我不明白爲什麼AnyObject應該成爲默認值。
實際上,您可以將IBAction
設置爲該對象層次結構中的任何類。例如,如果您有一個名爲YellowButton
的類是UIButton
的子類,則可以在AnyObject
,UIButton
和YellowButton
之間選擇。
要考慮的另一件事是,你可以有許多對象附加到相同IBAction
。而且他們甚至不需要是同一類型的。例如,您可以將UIBarButtonItem
和UIButton
連接到相同的IBAction
。如果發件人類型設置爲AnyObject
,則只能這樣做。
現在,爲什麼Apple選擇AnyObject作爲默認值,我只能猜測。我認爲這是因爲你可以在你的方法中鍵入發送者而不丟失任何信息。這樣,您甚至可以根據發件人的課程採取不同的行動。
我能想到的一個原因就是讓我們先說我寫了一個對象的接口,但我還不知道哪個控件類型會調用該操作。或者更進一步,我最終得到不止一種類型的控制。
通過默認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是有意義的,因爲您可以隨時更改以確保更好的類型安全性。
可能重複[Anyobject和UIbutton作爲發件人有什麼區別?](http://stackoverflow.com/questions/30475178/whats-the-difference-of-anyobject-and-uibutton-as-sender) – JAL