NSPopover автоматически закрывается

У меня есть xib с моим представлением и NSPopover с переходным поведением:

Настройка IB nspopover

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

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

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

Я хочу, чтобы всплывающее окно представляло несколько кнопок и исчезало только тогда, когда пользователь нажимает одну из этих кнопок или щелкает в другом месте пользовательского интерфейса. Например, кнопка Autolayout Pin в Interface Builder.

Я попытался определить поведение как Transient, Semi-transient, Application-defined. У всех один и тот же результат: он отключается через несколько секунд.

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

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

NSpopover раздражающе закрывается


person Morten J    schedule 26.04.2015    source источник
comment
Ваш метод moreClicked() вызывается во второй раз? Это закроет всплывающее окно.   -  person Ken Thomases    schedule 26.04.2015


Ответы (1)


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

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

person rounak    schedule 26.04.2015
comment
Я думаю ты прав. Сильно держу (пробовал и слабую удалять, и IBOutlet). Вызовы непосредственно перед делегатом обновляют tableView, который на самом деле делает некоторые относительно тяжелые вещи, такие как создание экземпляров нескольких контроллеров представления. Я попытался воспроизвести код в новом проекте, и там все работает нормально. Любые идеи о том, как сказать какао держаться за поповер? - person Morten J; 27.04.2015
comment
подождите минутку.. Контроллер просмотра, который я обновляю, - это тот самый контроллер просмотра, из-за которого всплывающее окно исчезает. Спасибо! - person Morten J; 27.04.2015
comment
Круто @MortenJ. Рад, что ты разобрался. Я столкнулся с аналогичной проблемой с UIPopover на iOS, поэтому был уверен, что это связано :) - person rounak; 27.04.2015