Popover освобождает контроллер представления контента сразу после инициализации - PullRequest
0 голосов
/ 31 января 2012

У меня странная проблема, когда UIPopovercontroller немедленно освобождает свой контроллер представления контента после загрузки всплывающего окна, а затем повторно инициализирует его.
Моя цель - прочитать текстовое поле, когда всплывающее окно закрыто.

У меня сложилось впечатление, что я создаю UIViewController и устанавливаю его в качестве контроллера представления контента для всплывающего окна. После этого PopoverViewController сохранит контроллер представления контента, и я могу (автоматически) освободить его.
Позже, когда всплывающее окно отклоняется, оно освобождает всплывающее окно (и вместе с ним контроллер представления содержимого). Но это не работает. Это мой соответствующий код:

- (IBAction)popoverButton:(id)sender {
  // Create & Initialize content view controller
  ContentViewController* cvc = [[[ContentViewController alloc] initWithNibName:@"ContentViewController" bundle:nil] autorelease];

  // Create, initialize and load popover
  popoverController = [[UIPopoverController alloc] initWithContentViewController:cvc];
  [popoverController setDelegate:self];
  [popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

  NSLog(@"popoverButton: %@, retainCount: %d", cvc, [cvc retainCount]);
}

- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)senderPopoverController
{
  NSLog(@"popover should dismiss");
  ContentViewController *dvc = (ContentViewController *)([popoverController contentViewController]);
  NSLog(@"%@ %@ %@", dvc, [dvc testTextfield], [[[dvc testTextfield] text] description]);
  return YES;
}

ContentViewController.m

- (void)viewDidLoad
{
  [super viewDidLoad];
  [[self testTextfield] setText:@"Bla"];
  NSLog(@"viewDidLoad: %@", testTextfield);
}

- (void)dealloc {
  NSLog(@"dealloc: %@", testTextfield);
  [testTextfield release];
  [super dealloc];
}

Когда я открываю поповер, Журнал будет (я думаю, что порядок вывода не соответствует порядку, когда он действительно вызывается):

Popover Test[2363:707] viewDidLoad: <UITextField: 0x185750; ...>
Popover Test[2363:707] viewDidLoad: (null)
Popover Test[2363:707] popoverButton: <ContentViewController: 0x1844e0>, retainCount: 4
Popover Test[2363:707] dealloc: <UITextField: 0x185750; ...>

И когда я отклоняю это:

Popover Test[2363:707] popover should dismiss
Popover Test[2363:707] <ContentViewController: 0x1844e0> (null) (null)
Popover Test[2363:707] popover did dismiss
Popover Test[2363:707] <UIPopoverController: 0x184860>
Popover Test[2363:707] dealloc: (null)

Так что мои вопросы будут:

  1. Почему ContentViewController освобождается и инициализируется во второй раз?
  2. Почему розетки (textField) больше не работают при второй загрузке?

Если бы я мог решить эту проблему, я мог бы читать из textField в popoverControllershouldDismissPopover

1 Ответ

1 голос
/ 31 января 2012

Поскольку ContentViewController является вашим классом, реализуйте соответствующий метод init* (если вы этого еще не сделали), установите точку останова, и отладчик будет останавливаться на ней при каждом выделении, отвечая на ваш вопрос о том, почему это так.быть воссозданным.

Обратите внимание, что retainCount бесполезен;не называй это.

Ах - хорошо, вы создаете один экземпляр при загрузке файла пера, а второй - прямо в коде.Вместо этого вы хотите где-нибудь розетку, которая связана с экземпляром в файле пера.

Что касается retainCount; Вызов -retainCount считается опасным и Когда использовать -retainCount?

...