2010-03-27 65 views
2

對於大多數操作,我只需在InterfaceBuilder中單擊並拖動,將某個接口對象的調用「連線」到我的代碼。例如,如果我想知道用戶何時單擊表中的一行,我將表中操作的連接拖動到控制器的操作中。爲什麼只有一些操作必須調用setTarget?

但現在讓我們考慮用戶雙擊一行。如果我希望在發生這種情況時調用我的某個操作,則不僅需要撥打-[NSTableView setDoubleAction],還需撥打也可撥打-[NSControl setTarget]。爲什麼?請問爲什麼Interface Builder不支持setDoubleAction?所有工具都有侷限性。我正試圖更好地瞭解如何以及爲什麼setTarget似乎沒有必要,除非我想要setDoubleAction才能工作。提出這個問題的另一種方法是:爲什麼我不需要在Interface Builder中做任何事情來設置表(單擊)操作的目標?

回答

1

如果您將表格視圖連接到IB的操作,然後調用setDoubleAction,則不需要再撥打setTarget。但是,如果您只希望收到雙擊消息,並且您沒有將表格視圖連接到IB中的操作,則必須調用setTarget

表視圖將發送actiondoubleAction到同一個目標。你可以想象,作爲NSTableView的正在實施這樣的:

@implementation NSTableView 

- (void)theUserClickedOnMe 
{ 
    [self sendAction:[self action] to:[self target]; 
} 

- (void)theUserDoubleClickedOnMe 
{ 
    [self sendAction:[self doubleAction] to:[self target]]; 
} 

@end 

和你正在做的IB是這樣的:

- (void)userConnectedControl:(NSControl *)control 
     toAction:(SEL)action 
     ofObject:(id)object 
{ 
    [control setTarget:object]; 
    [control setAction:action]; 
} 

真正的實現是無處接近,但這是有效的這是怎麼回事。

1

如果您設置了一個動作(或雙擊動作)並且未設置目標(或將目標設置爲nil),那麼動作消息將通過響應者鏈。

如果除了動作之外還設置了目標,動作消息將僅轉到該對象。

相關問題