我有一个视图作为另一个自定义警报视图的背景(浅灰色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];
我怎样才能总是忽略背景视图?
由于
答案 0 :(得分:1)
您似乎没有删除视图,只是通过将alpha设置为零来使其不可见。因此,每次调用第二个代码示例时,您都会将新版本的背景视图和对话框视图添加到self.view
。在第二次通话时,您将有两个背景视图,两个都有tag = 1,您将从调用[self.view.superview viewWithTag:1]
获得第一个背景视图,这就是您新添加的背景视图不会被隐藏的原因。
但并非全部,ResultDialogController
和ResultBackgroundViewController
也有内存泄漏。当您致电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来隐藏它们。