2009-05-31 30 views
-1

在Objective-C中,如何重新調用類的實例方法來調用另一個類中的方法?在Objective-C中,我是否重定向了一個包含實例的方法而沒有進行子類化?

說一個UIView類A包含另一個名爲childA的UIView類。我希望它能夠在調用childA的drawRect時調用A類中的方法,而不必子類化childA,並在其drawRect中執行所需的調用。這怎麼能實現?

另外,我如何動態地提供一個方法給childA的繪圖類?我知道這可能不是一個好的做法,但它對於測試目的會很有用。

回答

1

要回答你的第一個問題,關於重新佈線的方法:

你不想在總的原則是做這個,因爲它有點違背了面向對象設計的全部目的,而是出於測試目的,它可以有用。只要你在Leopard上,這也不是特別困難。

看看Objective-C 2.0 Runtime Reference,它包含王國的鑰匙,就像它一樣。請看功能class_getInstanceMethod,method_getImplementation,method_getTypeEncodingclass_addMethod,它們的組合讓您可以在運行時更改類的方法。

如果您只是將一個選擇器調換爲另一個選擇器,則method_exchangeImplementations是一個有用的快捷方式。

要回答你的第二個問題,關於動態地提供一個方法,那就是作爲傳遞SEL的方法,然後調用-performSelector:withObject:簡單:

@interface MyView : NSView { 
    SEL drawingSelector; 
    id drawingDelegate; 
} 
@property SEL drawingSelector; 
@property id drawingDelegate; 
@end 

@implementation MyView 

- (void)drawRect:(NSRect)rect { 
    [self.drawingDelegate performSelector:drawingSelector withObject:[NSValue valueWithRect:rect]]; 
} 

@end 
0

對於你提出的第一個問題,好像你會設置將UIView A作爲childA和其他UIViews的委託對象 - 然後他們可以使用委託方法調用A中想要的額外繪圖功能。

要麼這樣做,要麼讓每個孩子都要求superview,如果它是鍵入「A」調用您感興趣的方法。

+0

謝謝。我試圖做所有這些,而不必繼承childA。看起來你的建議會要求我繼承childA(UIView類型)並在那裏做必要的工作。 – Boon 2009-06-01 01:36:48

相關問題