Ошибка при использовании UIPopoverController - PullRequest
0 голосов
/ 23 декабря 2011

В моем текущем приложении я пытаюсь отобразить экран меню при нажатии кнопки на панели инструментов. Я обнаружил, что лучший способ сделать это - использовать UIPopoverController для отображения пользовательского представления, которое я создал. Однако кое-что в моем текущем коде имеет недостатки. Когда я запускаю свое приложение и нажимаю кнопку, я получаю сообщение об ошибке, которое говорит о том, что оно достигает деалока, пока всплывающее окно все еще видно. Даже глядя на несколько примеров подобных проблем, я не могу понять, как это исправить. Вот мой код:

-(IBAction)newMenu:(id)sender{


newTaskWindow *newTaskWin = [[newTaskWindow alloc]init];
UIView *test = [[UIView alloc]init];
test = newTaskWin.view;

UIPopoverController *taskPop = [[UIPopoverController alloc]initWithContentViewController:newTaskWin];

[taskPop setDelegate:self];
[taskPop presentPopoverFromBarButtonItem:newTaskButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
[taskPop setPopoverContentSize:CGSizeMake(400, 500)];

Есть идеи? Заранее спасибо

}

Это ошибка, которую он выдает:

 *** Terminating app due to uncaught exception 'NSGenericException', reason: '-   [UIPopoverController dealloc] reached while popover is still visible.'

*** First throw call stack:
(0x381fb8bf 0x37d471e5 0x381fb7b9 0x381fb7db 0x32065f71 0x37d430c5 0x37d44db7 0x2ecf       0x38155435 0x31cbe9eb 0x31d843cf 0x38155435 0x31cbe9eb 0x31cbe9a7 0x31cbe985 0x31cbe6f5   0x31cbf02d 0x31cbd50f 0x31cbcf01 0x31ca34ed 0x31ca2d2d 0x37f29df3 0x381cf553 0x381cf4f5   0x381ce343 0x381514dd 0x381513a5 0x37f28fcd 0x31cd1743 0x2bd5 0x2b6c)
terminate called throwing an exception(gdb)

Ответы [ 3 ]

12 голосов
/ 23 декабря 2011

Попробуйте, в заголовочном файле .h текущего класса:

@property (nonatomic, retain) UIPopoverController *myPopover;

А в файле реализации .m:

//right after @implementation YourCurrentClassName
@synthesize myPopover;

А в стороне - (IBAction) newMenu: (id) метод отправителя, замените последние две строки на эти:

[taskPop setPopoverContentSize:CGSizeMake(400, 500)];
self.myPopover = taskPop;
[self.myPopover presentPopoverFromBarButtonItem:newTaskButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
[taskPop release];  //if not using ARC
3 голосов
/ 05 апреля 2013
Here Popover is a popovercontroller

if (self.popover) {
         [self.popover dismissPopoverAnimated:YES];
}
0 голосов
/ 23 декабря 2011

Где вы выпустили объект taskPop.

Если это сразу после презентации, то это может быть причиной.

Установите делегат и освободите popoverController в следующем методе делегата:

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {

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

Надеюсь, это поможет.

...