Вопрос памяти UIPopoverController - PullRequest
0 голосов
/ 07 сентября 2011

Я создаю UIPopoverController и устанавливаю «Editor1» в качестве контроллера представления содержимого.Когда вызывающий абонент получает didDismissPopover, я выпускаю UIPopoverController.Это код:

- (IBAction)open1:(id)sender {

Editor1 *editor = [[Editor1 alloc] initWithNibName:@"Editor1" bundle:nil];
_popoverController = [[UIPopoverController alloc] initWithContentViewController:editor];
_popoverController.delegate = self;
[editor release];

[self.popOverController presentPopoverFromRect:self.open1Button.bounds inView:self.open1Button permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO];
}

- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController{
    NSLog(@"popoverControllerShouldDismissPopover");
    return YES;
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController{
     NSLog(@"popvoerControllerDidDismissPopover");
    [_popoverController release];
}

В моем редакторе у меня есть UITextField, где пользователь меняет текст, и я сохраняю его, когда получаю сообщение "editDidEnd"

- (IBAction)editingDidEnd:(id)sender {
   NSLog(@"Editing did End");
   // SAVE PROCEDURE
}

МойВопрос касается порядка, в котором вызываются методы.Порядок:

2011-09-07 12:35:21.628 iosTest[1967:b603] popoverControllerShouldDismissPopover
2011-09-07 12:35:21.629 iosTest[1967:b603] popvoerControllerDidDismissPopover 
2011-09-07 12:35:21.983 iosTest[1967:b603] Editing did End
2011-09-07 12:35:21.985 iosTest[1967:b603] viewWill Disappear

Как вы можете видеть, вызов popoverControllerDidDismissPopover вызывается до editingDidEnd:, поэтому это означает, что я освобождаю popover перед выполнением процедуры сохранения.Это может привести к сбою.

Кроме того, в моей процедуре сохранения мне нужно в некоторых случаях запрашивать подтверждение у пользователя.Я использую UIAlertView для этого.

У вас есть какие-либо рекомендации?

Ответы [ 3 ]

0 голосов
/ 07 сентября 2011

Почему вы не используете UITextFieldDelegate протокол? Использование:

aTextField.delegate = self;

(...)

- (void)textFieldDidEndEditing:(UITextField *)textField {
    NSLog(@"Editing did End");
    // SAVE PROCEDURE
}

Для получения дополнительной информации прочитайте документацию .

0 голосов
/ 08 сентября 2011

Обычно представления ведут себя хорошо и не отправляют события после того, как они находятся за пределами экрана.Вы можете проверить наличие потенциальных проблем, включив зомби (установите переменную окружения NSZombieEnabled = YES).

В случае сбоя правильное место для его исправления - -[Editor1 dealloc] (и, возможно, -viewDidUnload):просто сделайте textField.delegate = nil, и вы должны прекратить получать обратные вызовы.Обычно это не требуется, за исключением веб-представлений и представлений прокрутки, где это кажется проблематичным (анимация прокрутки продолжается, даже если виртуальный канал находится за пределами экрана).

В вашем случае вы, вероятно, можете сделать сохранение в-popoverControllerShouldDismissPopover:, возвращая NO, если вам нужно отобразить UIAlertView (и закрывая всплывающее окно при нажатии кнопки).

0 голосов
/ 07 сентября 2011

похоже, что _popoverController является свойством экземпляра.в этом случае вы можете освободить его в методе viewDidUnload родительского контроллера.

...