iPhone SDK - 调用视图的父视图的视图控制器的方法

3

你好,我该如何在当前视图中调用当前视图父视图的视图控制器中实现的方法呢?请帮助我,谢谢。

4个回答

7
通常这是通过委托来完成的。
让你的视图接口定义一个协议和一些委托引用。然后让父视图控制器实现该协议。
随后,父视图控制器会执行以下操作:
someView.fooDelegate = self;

那么视图将会执行以下操作:

if(self.fooDelegate != nil) {
   if([fooDelegate respondsToSelector:...]) {
      [fooDelegate performSelector:...];
   }
}

这并非编译过的代码,但我认为你可以得出大概意思。


4
你可以添加一个函数-(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。 希望我理解您的问题是正确的...

你好,我尝试了你的建议。现在我可以访问[theSuperview correctIt]并且它可以正确编译。但是我看不到任何更正,甚至没有NSlogs。你认为我应该检查什么吗??再次感谢您。 - kossibox
我认为你应该通过调用正确的目标位置来刷新你的视图,进行校正后[self setNeedsDisplay:YES]。 - Nava Carmon

4

UIViews对它们的视图控制器没有了解。您需要创建一个自定义的UIView子类来维护对一个(或多个)视图控制器的引用,尽管这样做会在UIView和UIViewController之间引入进一步的耦合。

您应该考虑实现父视图或视图类中的方法,而不是在视图控制器中实现它。


1

这里还有另一种方法:

SuperviewsViewController *controller = self.superview.nextResponder;

if (controller && [controller isKindOfClass:[SuperviewsViewController class]])
{
    [controller method];
}

在大多数情况下,它应该能够正常工作。

苹果的UIResponder参考


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接