Значение NSTableColumn, привязанное к NSArrayController самого переднего окна, выдает исключения при изменении окна

У меня есть NSTableView в плавающем окне, которое динамически привязывается к свойству arrangedObjects экземпляра NSArrayController, соответствующего самому переднему окну документа, с кодом, подобным следующему:

NSArrayController *documentSpecificArrayController;  // properly set elsewhere
NSTableColumn *tableColumnToBind;  // properly set elsewhere

[tableColumnToBind unbind:NSValueBinding];
[tableColumnToBind bind:NSValueBinding
               toObject:documentSpecificArrayController
            withKeyPath:@"arrangedObjects"
                options:[NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES],
                         NSContinuouslyUpdatesValueBindingOption,
                         nil]];

Пока представленный массив / табличное представление пусты, все работает нормально; все различные операции с табличным представлением / представленным массивом в одном документе работают нормально. Если перейти от документа с непустым представленным массивом к документу, для которого представленный массив пуст, генерируется бесконечный поток *** -[NSCFArray objectAtIndex:]: index (0) beyond bounds (0) исключений.

Мне не хватает чего-то, что мне нужно сделать, чтобы аккуратно разорвать привязку при переключении окон? Что-то другое? (Есть ли какая-то конкретная информация, которую я пропустил, которая помогла бы диагностировать мою ошибку?)


person Isaac    schedule 16.01.2011    source источник
comment
правильно установить в другом месте [необходима ссылка] :-)   -  person Joshua Nozzi    schedule 16.01.2011
comment
@ Джошуа Ноцци: Я знал, что кто-нибудь спросит. :) Контроллер массива - это свойство класса документа, который является делегатом нового самого верхнего окна, так что оно получилось таким; столбец таблицы содержится в табличном представлении, которое связано с IBOutlet класса, в котором встречается этот код. Я проверил, независимо от этого выброса исключения, что обе переменные установлены и изменяются, как ожидалось.   -  person Isaac    schedule 16.01.2011


Ответы (1)


Основываясь на вашем комментарии, кажется, что вы пытаетесь создать палитру инспектора или что-то подобное. Это правда? Если это так, вам, вероятно, следует просто выполнить привязку непосредственно к контроллеру массива активного документа, привязав к общему приложению с ключевым путем mainWindow.document.myArrayController. Я думаю, что вы сталкиваетесь с проблемами цикла выполнения / времени с привязками, и использование этого метода должно смягчить это.

person Joshua Nozzi    schedule 16.01.2011
comment
Я скоро протестирую, но (1) вариант использования - это что-то вроде палитры инспектора, (2) это имеет смысл с тем, что я видел до сих пор, и (3) это упростило бы то, что было довольно длинным и беспорядочным способом соединять вещи в одну простую привязку. Есть ли где-нибудь в документации, что я должен был увидеть, как это сделать с самого начала? - person Isaac; 16.01.2011
comment
Я не знаю, задокументировано ли это где-нибудь в материалах Apple, но это решение, которое существует уже 10,3 дня на различных сайтах сообщества Cocoa. Сам пользуюсь. Предостережение: если у вас разные типы документов и не у всех есть этот путь к ключу, вам нужно заполнить пробелы и вернуть nil для части myArrayController в несовместимых классах документов, иначе вы получите ошибки ключевого пути. - person Joshua Nozzi; 16.01.2011
comment
Дополнительное предложение: поместите контроллер массива в xib палитры и вместо этого привяжите таблицу к it. Затем привяжите этот контент контроллера массива к коллекции, которую контроллер массива документа должен представлять (с помощью того же трюка с путями ключа, только с другим конечным сегментом - ключом коллекции, а не контроллером массива). Окно палитры должно иметь собственные контроллеры. - person Joshua Nozzi; 16.01.2011
comment
Я уверен, что делаю что-то глупое, но у меня вообще не получалось заставить эту привязку работать - табличное представление в палитре никогда ничего не показывает. (Все элементы управления в палитре имеют идентичные элементы управления в окне документа, привязанные к одним и тем же свойствам объекта документа, поэтому я могу видеть, что должно происходить в палитре.) Кроме того, я ожидал бы проблема, обсуждаемая здесь, где, если палитра является главным окном, привязка будет нарушена, но я думаю, что это было бы проще обойти. - person Isaac; 16.01.2011
comment
Использование отдельного экземпляра контроллера массива в XIB для палитры помогло. Спасибо. - person Isaac; 16.01.2011