UIPopoverController присутствуетPopoverFromRect аварийно завершает работу

Я пытаюсь создать простое всплывающее окно где-нибудь на экране, но оно почему-то продолжает падать. Это не дает мне никаких ошибок (объекты зомби включены)

UIViewController *viewController = [[UIViewController alloc] init];
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
view.backgroundColor = [UIColor redColor];
viewController.view = view;

UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:viewController];
[popover presentPopoverFromRect:CGRectMake(0, 0, 100, 100) inView:self.view.superview permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

Я просто пытаюсь создать всплывающее окно в случайном месте, разве это невозможно?

РЕДАКТИРОВАТЬ: Также попробовал это так

@property (nonatomic, retain) UIPopoverController *popover;

@synthesize popover = _popover;

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];

_popover = [[UIPopoverController alloc] initWithContentViewController:viewController];
_popover.delegate = self;
[_popover presentPopoverFromRect:CGRectMake(0, 0, 200, 200) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

EDIT2: это может быть актуально, и я забыл упомянуть, но этот код вызывается в другом представлении.

Это отлично работает!

UIViewController *viewController = [[UIViewController alloc] init];
viewController.contentSizeForViewInPopover = CGSizeMake(200, 200);
viewController.view.backgroundColor = [UIColor redColor];

UIPopoverController *popver1 = [[UIPopoverController alloc] initWithContentViewController:viewController];
[popver1 presentPopoverFromRect:CGRectMake(250, 200, 200, 200) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

DocumentViewController *document = [[DocumentViewController alloc] initWithIssue:_readerModel.currentIssue];
[self.navigationController pushViewController:document animated:YES];

Когда я вызываю тот же код EXACT внутри DocumentViewController, он не работает.


person woutr_be    schedule 30.08.2012    source источник
comment
У вашего контроллера представления уже есть представление — почему вы влияете на представление в его свойстве представления? Это звучит неправильно.   -  person tiguero    schedule 30.08.2012
comment
@tiguero Конечно, но сейчас проблема не в этом, я просто сделал это в качестве примера, чтобы показать код.   -  person woutr_be    schedule 30.08.2012


Ответы (3)


Хм. Не вижу причин для сбоя здесь (код работает нормально, когда я его тестирую).

Но: если self.view.superview из вашего кода равно nil, произойдет сбой с сообщением вида

 [...] Popovers cannot be presented from a view which does not have a window [...]

И: есть еще несколько исправлений, которые нужно сделать, если вы хотите правильно представить popover:

  • Установите свойство contentSizeForViewInPopover в вашем viewController, чтобы управлять реальным размером вашего popover.

  • Измените UIPopoverArrowDirectionDown на UIPopoverArrowDirectionAny (особенно если вы используете прямоугольник с origin=(0,0) для представления). В противном случае вы не увидите файл popover.

person Kai Huppmann    schedule 30.08.2012
comment
Спасибо за объяснение, но, к сожалению, это мне больше не поможет, я изменил self.view.superview обратно на self.view, так как это было nil. Добавил contetnSizeForViewInPopover и изменил направление стрелки на любое, но все равно он просто вылетает без предупреждения, когда я вызываю presentPopoverFromRect - person woutr_be; 30.08.2012
comment
Значит, в вашей консоли Xcode нет сообщения о сбое? Вы тестируете на реальном устройстве? Если да: проверяли ли вы журналы устройств? - person Kai Huppmann; 30.08.2012
comment
Никакого сообщения, просто Thread 1: signal SIGTRAP, у меня нет под рукой реального устройства atm. - person woutr_be; 30.08.2012
comment
Поиск в Google для SIGTRAP говорит мне, что это может быть связано с Xcode/Debugger и не имеет ничего общего с вашим кодом. Первое, что я бы попробовал: перезапустить Xcode. - person Kai Huppmann; 30.08.2012
comment
Я пытался перезагрузиться раньше после того, как погуглил SIGTRAP, но это, похоже, мало помогает, может быть, просто перезагрузил весь компьютер. - person woutr_be; 30.08.2012

вы можете проверить, является ли окно нулевым, прежде чем представлять всплывающее окно с помощью

if (self.view.window != nil)

также вы вызываете приведенный выше код в viewDidLoad ИЛИ viewWillAppear?

Можете ли вы попробовать тот же код из метода viewDidAppear или метода didMoveToWindow

person prasad    schedule 30.08.2012
comment
self.view.window на самом деле nil, viewDidAppear вроде не вызывается. - person woutr_be; 30.08.2012
comment
возможно, вы вызываете этот код из класса, добавленного в качестве подвида, поэтому метод viewDidAppear не будет вызываться в классе подвида. Можете ли вы вызвать метод, который содержит код, связанный с popover, из viewDidAppear класса superview. Также проверьте это аналогичный вопрос. - person prasad; 30.08.2012

Я думаю, вы должны определить popover как свойство, а не локальную переменную

person user1203650    schedule 30.08.2012