【发布时间】:2010-11-27 05:11:52
【问题描述】:
你好,我如何在当前视图中调用在当前视图的父视图的视图控制器中实现的方法? 你能帮我吗。 谢谢
【问题讨论】:
标签: iphone uiview uiviewcontroller
你好,我如何在当前视图中调用在当前视图的父视图的视图控制器中实现的方法? 你能帮我吗。 谢谢
【问题讨论】:
标签: iphone uiview uiviewcontroller
这是另一种方式:
SuperviewsViewController *controller = self.superview.nextResponder;
if (controller && [controller isKindOfClass:[SuperviewsViewController class]])
{
[controller method];
}
它应该在大多数情况下都有效。
【讨论】:
你可以添加一个函数 -(void)initWithView:(EchiquierDisplayView *)aSuperview 或类似的东西,在你的
中定义一个引用@interface pieceDraggableImageView : UIImageView {
CGPoint startLocation;
CGPoint startLocationInView;
EchiquierDisplayView *theSuperview;
}
@property (nonatomic, retain) EchiquierDisplayView *theSuperview;
-(void)correctDestinationPosition;
-(void)initWithView:(EchiquierDisplayView *)aSuperview;
...
-(void)askSuperview;
@end
@implementation pieceDraggableImageView
...
-(void)initWithView:(EchiquierDisplayView *)aSuperview
{
theSuperview = aSuperview;
}
...
-(void) correctDestinationPosition
{
[theSuperview correctIt];
}
现在请务必在您的超级视图中实现函数 correctIt。 希望我能正确理解您的问题...
【讨论】:
这通常是通过委托来完成的。
让您的视图接口定义协议和对某个委托的引用。然后让你的父视图控制器实现这个协议。
然后父母会这样做:
someView.fooDelegate = self;
那么视图会做这样的事情:
if(self.fooDelegate != nil) {
if([fooDelegate respondsToSelector:...]) {
[fooDelegate performSelector:...];
}
}
这不是编译的,但我想你明白了。
【讨论】:
UIViews 不知道它们的视图控制器。您将需要创建一个自定义 UIView 子类来维护对一个(或可能不止一个)视图控制器的引用,尽管这样做会在 UIView 和 UIViewController 之间引入进一步的耦合。
您应该考虑在超级视图或视图的类中实现该方法,而不是在视图控制器中实现它。
【讨论】: