Привязка к представляемому объекту NSViewController - PullRequest
4 голосов
/ 03 октября 2009

(Аннотация: привязки работают в коде, но не в IB)

У меня есть окно, управляемое NSWindowController. Слева от окна находится исходный вид. Справа находится табличное представление, показывающее элементы выбранного источника.

Я установил NSTreeController в моем окне XIB. Я хочу, чтобы его содержимое использовалось для просмотра исходного кода. Его выбор будет управлять представлением таблицы.

Я пытаюсь разделить это с помощью NSViewControllers. Один контроллер представления загрузит NIB, содержащий исходное представление. Другой контроллер представления загрузит представление таблицы.

Видя, что мне нужен доступ к NSTreeController в контроллере представления исходного кода, я установил его как представляемый объект контроллера представления. (На самом деле, чтобы эта настройка выполнялась ко времени вызова awakeFromNib на контроллере представления, я превратил представленный объект в IBOutlet).

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

[outlineView bind:@"content"
         toObject:sources
      withKeyPath:@"arrangedObjects"
          options:nil];
[outlineView bind:@"selectionIndexPaths"
         toObject:sources
      withKeyPath:@"selectionIndexPaths"
          options:nil];
[[outlineView tableColumnWithIdentifier:@"Title"] bind:@"value"
                                              toObject:sources
                                           withKeyPath:@"arrangedObjects.title"
                                               options:nil];

Однако я не могу воспроизвести это с помощью Interface Builder. Дело в том, что здесь текстовое поле «Контроллер» недоступно. Таким образом, я привязываю «значение» столбца к владельцу файла, используя ключ модели keyPath «представленныйObject.arrangedObjects.title». Это не показывает желаемое поведение. На самом деле исключение выдается: -[NSProxy doesNotRecognizeSelector:_mutatingNodes] called!

Как я могу использовать представленный объект в IB? Могу ли я создать контроллер в IB, который действует как прокси для представленного объекта? Могу ли я установить контроллер дерева в исходном виде XIB, который во время загрузки NIB заменяется на представленный объект?

Ответы [ 2 ]

2 голосов
/ 08 октября 2009

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

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

0 голосов
/ 29 августа 2018

У меня похожие проблемы, когда я пытаюсь передать ссылку на контроллер объекта (NSTreeController в моем случае). Я не думаю, что именно так Apple хочет, чтобы вы использовали их KVO-совместимые контроллеры. Исключения выглядят так, как будто они разархивированы в XIB и связаны со временем.

Хитрость не для передачи контроллеров, а передача базовых данных и синхронизация выбора .

Таким образом, вы можете установить свои привязки в раскадровке и не получите никаких исключений. Вам нужно будет установить новый экземпляр контроллера объекта для каждого дочернего контроллера представления (скопируйте и вставьте в раскадровку, как только вы настроите первый, работает). Для подробного примера взгляните на другой ответ, который более детально описан .

...