OSX NSTextView становится недоступным для редактирования после отображения NSAlert, NSOpenPanel

На мой взгляд, у меня есть NSTextView, который работает так, как должен, но когда я показываю NSAlert и закрываю его, он становится недоступным для редактирования (текст все еще можно выбрать). NSAlert - это предупреждение о сохранении / отмене, которое обновляет строку textView, когда пользователь выбирает сохранение, строка не обновляется, когда пользователь нажимает отмену. В обоих случаях textView нельзя было редактировать, предупреждение отображается, когда пользователь внес изменения и хочет изменить выбор tableView.

Похоже, что textView отказывается от первого респондента, но при взломе и проверке в консоли его «истинного» я ​​также проверил некоторые другие значения после того, как представление стало недоступным для редактирования:

  • isEditable было True
  • isSelectable был True
  • canBecomeKeyView был True
  • acceptptsFirstResponder был True
  • acceptptsTouchEvents был False, проверено True, но не сработало

Моя "тестовая" настройка:  Настройка

Видео, то же самое при запуске всплывающего окна при изменении выбора представления таблицы и кнопки: video

Мой всплывающий код

func dialogOKCancel(question: String, text: String) -> Bool {
        let myPopup: NSAlert = NSAlert()
        myPopup.messageText = question
        myPopup.informativeText = text
        myPopup.alertStyle = NSAlertStyle.warning
        myPopup.addButton(withTitle: "OK")
        myPopup.addButton(withTitle: "Cancel")

        return myPopup.runModal() == NSAlertFirstButtonReturn
    }

let answer = self.dialogOKCancel(question: "Ok?", text: "Choose your answer.")

также пробовал:

        let a = NSAlert()
        a.messageText = "Delete the document?"
        a.informativeText = "Are you sure you would like to delete the document?"
        a.addButton(withTitle: "Delete")
        a.addButton(withTitle: "Cancel")
        a.alertStyle = NSAlertStyle.critical

        a.beginSheetModal(for: self.view.window!, completionHandler: { (modalResponse) -> Void in
            if modalResponse == NSAlertFirstButtonReturn {
                print("Document deleted")
            }
        })

Что я пробовал:

  • Удалите все обновления textView, показывая, что предупреждение по-прежнему нарушает его
  • Перетаскивание нового «нетронутого» textView в мою раскадровку, но теперь оба textView стали недоступными для редактирования
  • Я попытался показать NSAlert при нажатии кнопки, а не при изменении выбора tableView. Здесь textView, который я редактировал, остается первым респондентом, но как только я покидаю textView, его снова нельзя редактировать.
  • Я пробовал запускать только анимацию вместо NSAlert, здесь textView продолжает работать
  • Я попытался заменить NSAlert на оверлей View с заголовком / описанием / кнопками. при отображении этого диалогового окна textView также стал недоступным для редактирования

Я застрял на этом надолго, и любая помощь приветствуется, спасибо


person Steven B.    schedule 15.03.2017    source источник
comment
Почему бы вам просто не показать, как вы показываете, и закрыть окно предупреждений?   -  person El Tomato    schedule 16.03.2017
comment
Добавлен всплывающий код и видео   -  person Steven B.    schedule 17.03.2017
comment
На вашем месте я бы запустил поиск и узнал, как пользоваться NSAlert.   -  person El Tomato    schedule 17.03.2017
comment
Не могли бы вы быть более конкретными, я попробовал 4 разных способа показать NSAlert, даже попытался заменить NSAlert обычным NSView ... запуск поиска в NSAlert - бесполезный ответ   -  person Steven B.    schedule 20.03.2017
comment
Здесь я получаю ответы для NSAlert. Если ни один из них не поможет, я сомневаюсь, что поможет моя дальнейшая помощь.   -  person El Tomato    schedule 20.03.2017


Ответы (1)


После долгой отладки я обнаружил, что именно эта строка сломала текстовые поля, я оставлю этот пост онлайн на случай, если кто-то еще наткнется на эту странную проблему.

window?.styleMask = NSFullSizeContentViewWindowMask

удаление этой строки устранило проблему.

person Steven B.    schedule 20.03.2017
comment
если вы создадите собственный класс окна и переопределите canbecomekey, чтобы вернуть истину, это будет работать stackoverflow.com/questions/9464423/ - person ryan gordon; 01.06.2017