iPhone如何从子视图中调用父视图中的方法

时间:2011-02-22 17:21:00

标签: iphone

我有基于视图的应用程序,我希望在从子视图中删除子视图时调用superview(parentview)中的方法。     1)两个(父,子)视图都是UIViewController的子类     2)添加子视图为[self.view addSubview:subviewController];     3)我通过[self.view removeFromSuperview];

从父母中删除子视图

任何人都可以帮助我。

1 个答案:

答案 0 :(得分:4)

你似乎对术语有点困惑。 UIViews和UIViewControllers是分开的东西。视图控制器有视图。视图可以知道何时从中删除了某些内容,但在这种情况下,您希望视图控制器知道何时从视图中删除了某些内容?

不对程序中的类层次结构做任何其他假设,我能想到的最好的方法是创建一个自定义子类UIView,它将视图控制器保持为委托,并在要删除某些内容时通知它。使用其中一个作为父视图,并将父视图控制器作为委托给它。

当父视图控制器获取消息时,它会将要删除的视图与属于子视图控制器的视图进行比较。如果他们匹配那么你就得到了你想要的东西。

示例UIView子类,接口:

@protocol UIViewThatNotifiesViewControllerDelegate
- (void)view:(UIView *)view willRemoveSubview:(UIView *)subview;
@end

@interface UIViewThatNotifiesViewController: UIView
{
    UIViewController <UIViewThatNotifiesViewControllerDelegate> *delegate;
}

@property (nonatomic, assign) UIViewController <UIViewThatNotifiesViewControllerDelegate> *delegate;
@end

实现:

@implementation UIViewThatNotifiesViewController

@synthesize delegate;

- (void)willRemoveSubview:(UIView *)subview
{
    [delegate view:self willRemoveSubview:subview];
    [super willRemoveSubview:subview];
}

@end

假设您的父视图控制器的当前视图是UIView类型,请将其更改(在Interface Builder和Xcode中)为UIViewThatNotifiesViewController类型。声明您的视图控制器实现UIViewThatNotifiesViewController协议以避免编译器警告。然后将这样的内容添加到视图控制器:

- (void)view:(UIView *)view willRemoveSubview:(UIView *)subview
{
    if(subview == subviewController.view)
    {
        NSLog(@"his view is in the process of being removed");
    }
}

执行此类操作的风格更正常的方法是让每个视图控制器管理整个屏幕充满信息。因此,您不要将视图从一个添加到另一个。相反,你使用presentModalViewController:将控制从一个控制器传递到另一个控制器并解除传递给它:传递回来(通常使用[self.parentViewController dismissModalViewController:...],这样孩子们可以解雇自己,无论父母如何)。然后,您可以使用视图控制器方法viewWillAppear,viewDidAppear,viewWillDisappear和viewWillAppear来确定您是否要从可见转换为不可见,反之亦然。