2015-04-26 4 views
2

У меня есть XIB с моей точки зрения и NSPopover с транзиторной поведением:NSPopover закрывается автоматически

IB nspopover setup

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

@IBAction func moreClicked(sender: NSButton) {  
    if !moreOpen { 
     moreOpen = true 
     scriptsPopover.showRelativeToRect(sender.bounds, ofView: sender, preferredEdge: 2) 
    } else { 
     moreOpen = false 
     scriptsPopover.close() 
    } 
} 

Когда я нажимаю кнопку, popover появляется, как ожидалось. Но через 5 секунд он исчезает.

Я хочу, чтобы popover отображал несколько кнопок и исчезал только тогда, когда пользователь нажимает одну из этих кнопок или щелкает в другом месте пользовательского интерфейса. Как и кнопка «Автозапуск» в Interface Builder, чтобы упомянуть пример.

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

Я попытался реализовать делегат popoverShouldClose и вернуть false, чтобы я мог контролировать его. Он блокирует закрытие, но когда пользователь нажимает кнопку, чтобы закрыть, он просто открывает новый popover поверх старого. Попутчик также теряет свою стрелку после того, как я верну ложь из popoverShouldClose, которая выглядит странно.

Вот запись раздражающих автоматического закрытия

NSpopover annnoyingly closes itself

+0

Вызывается ли ваш метод 'moreClicked()' во второй раз? Это закрыло бы популярность. –

ответ

3

См трассировки стека, когда метод popoverShouldClose называется. Вы увидите причину этого в этой трассе стека, а оттуда попытайтесь устранить эту причину.

То, что я подозреваю, заключается в том, что ваш popover освобождается, поскольку он не сильно удерживается вами.

+0

Я думаю, что ты прав. Я держу его сильно (попробовал как удалить слабый, так и IBOutlet). Вызовы непосредственно перед делегатом освежают tableView, который фактически делает некоторые относительно тяжелые вещи, такие как создание нескольких viewcontrollers. Я попытался воспроизвести код в новом проекте, и там все отлично работает. Любые идеи о том, как сказать какао, чтобы держаться за popover? –

+0

Подождите минуту .. Viewcontroller, который я обновляю, - это тот самый диспетчер представлений, который заставляет popover исчезать. Благодаря! –

+0

Cool @MortenJ. Рад, что вы его отсортировали. Я столкнулся с аналогичной проблемой с UIPopover на iOS, поэтому был уверен, что это было связано :) – rounak