Скрыть подпредставление другого контроллера представления - PullRequest
0 голосов
/ 30 ноября 2010

У меня есть представление, которое выступает в качестве фона (светло-серый 0,5 альфа) для другого настраиваемого представления оповещений.

Когда пользователь нажимает кнопку ОК в настраиваемом оповещении, я хочу скрыть настраиваемое оповещениеи фоновый вид тоже.

Оба представления являются подпредставлениями одного и того же суперпредставления ...

Я делаю это в методе buttonTapped:, чтобы скрыть представления, и это работает с первой попытки, но со второго разадалее фоновые представления никогда не отклоняются ... предупреждения скрываются правильно каждый раз.

[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 ]

1 голос
/ 30 ноября 2010

Вы, кажется, не удаляете представления, вы просто делаете невидимым, устанавливая альфа в ноль.Поэтому каждый раз, когда вы вызываете ваш второй пример кода, вы добавляете новую версию фонового представления и диалогового окна в 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]; 
     }
 ];

И чтобы возглавить еговыкл, не забудьте освободить контроллер ivars в dealloc.

0 голосов
/ 30 ноября 2010

Вы можете скрыть их, установив свойство HIDE, чтобы представления были истинными.

...