2009-05-31 32 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

相关问题