У меня есть приложение MacOS на NSDocument
с Core Data, которое по своей природе может иметь только один открытый документ за раз. Поэтому, когда открывается новый документ, я закрываю открытый в данный момент. Все связанные с документами пользовательские интерфейсы находятся в отдельном оконном контроллере, и все работает хорошо.
Но у меня также есть пункт меню, который переключает отдельное окно, в котором отображается некоторая информация о документе. Пользовательский интерфейс представляет собой простой NSTableView
, привязанный к NSArrayController
. Свойство managagedObjectContext
контроллера массива устанавливается при изменении текущего документа. Это всегда приводит к взлому sh с EXC_BAD_INSTRUCTION
.
Чтобы сузить проблему, я полностью удалил все привязки и любые другие манипуляции с контроллером массива. Cra sh ушел. Я также создал новый testArrayController
в коде, чтобы посмотреть, что там происходит, и, конечно, я мог бы воспроизвести cra sh:
let testArrayController = NSArrayController()
var document: Document? {
didSet {
if document != nil {
testArrayController.managedObjectContext = document?.managedObjectContext
testArrayController.prepareContent() // <---- this causes the crash later on
} else {
testArrayController.managedObjectContext = nil
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
testArrayController.entityName = "MyEntity"
...
}
Кажется, что вызов prepareContent()
каким-то образом блокирует контроллер массива для определяет c managedObjectContext и вызывает cra sh, когда он установлен в ноль.
Как можно безопасно «деактивировать» NSArrayController
или изменить его managedObjectContext?