隐藏不同视图控制器的子视图

时间:2010-11-30 16:48:35

标签: iphone objective-c uiview uiviewcontroller subview

我有一个视图作为另一个自定义警报视图的背景(浅灰色0.5 alpha)。

当用户点击自定义提醒上的“确定”按钮时,我也想隐藏自定义提醒和背景视图。

两个视图都是同一个超级视图的子视图......

我在buttonTapped:方法中执行此操作以隐藏视图,并且它适用于第一次尝试,但从第二次开始,后台视图永远不会被忽略...警报每次都会正确隐藏。 / p>

[UIView animateWithDuration:0.5f animations:^{
    self.view.alpha=0.0f; //hide alert
    [self.view.superview viewWithTag:1].alpha=0.0f; //hide background       
}];

它们被添加为子视图,如下所示:

ResultDialogController *dialogController = [[[ResultDialogController alloc] initWithNibName:@"ResultDialogController_" bundle:nil] retain];
ResultBackgroundViewController *bgViewController = [[[ResultBackgroundViewController alloc] initWithNibName:@"ResultView" bundle:nil] retain];

dialogController.view.alpha=0;
bgViewController.view.alpha=0;
bgViewController.view.tag=1;

[UIView animateWithDuration:0.5f animations:^{
    bgViewController.view.alpha=0.5f;                                       
    dialogController.view.alpha=1.0f;
    }];

[self.view addSubview:bgViewController.view];
[self.view addSubview:dialogController.view];
[dialogController release];
[bgViewController release];

我怎样才能总是忽略背景视图?

由于

2 个答案:

答案 0 :(得分:1)

您似乎没有删除视图,只是通过将alpha设置为零来使其不可见。因此,每次调用第二个代码示例时,您都会将新版本的背景视图和对话框视图添加到self.view。在第二次通话时,您将有两个背景视图,两个都有tag = 1,您将从调用[self.view.superview viewWithTag:1]获得第一个背景视图,这就是您新添加的背景视图不会被隐藏的原因。

但并非全部,ResultDialogControllerResultBackgroundViewController也有内存泄漏。当您致电retain时,无需拨打initWithNibName:bundle:。也许你这样做是因为当你释放控制器时有些崩溃?

您应该为控制器创建ivars和属性。

@property (nonatomic, retain) ResultDialogController *resultController;
@property (nonatomic, retain) ResultBackgroundController *backgroundController;

然后在显示控制器时,您可以执行以下操作:

ResultDialogController *dialogController = [[ResultDialogController alloc] initWithNibName:@"ResultDialogController_" bundle:nil];
self.dialogController = dialogController;

ResultBackgroundViewController *bgViewController = [[ResultBackgroundViewController alloc] initWithNibName:@"ResultView" bundle:nil];
self.backgroundController = bgViewController;

// do the same as before

然后在buttonTapped:中执行:

[UIView animateWithDuration:0.5f
     animations: ^{
      self.dialogController.view.alpha = 0;
      self.backgroundController.view.alpha = 0;
     }
     completion: ^(BOOL finished){
      [self.dialogController.view removeFromSuperview];
      [self.backgroundController.view removeFromSuperview]; 
     }
 ];

最重要的是,不要忘记在dealloc中释放控制器ivars。

答案 1 :(得分:0)

您可以通过将视图的HIDE属性设置为true来隐藏它们。