Зачем мне использовать NSObjectController? - PullRequest
12 голосов
/ 27 декабря 2011

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

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

Однако у меня есть один очень прямой и конкретный вопрос: зачем нужен NSObjectController, еслиЯ могу установить привязки напрямую?

Например, код:

[controller bind:@"contentObject" toObject:self withKeyPath:@"numberOfPieSlices" options:nil];

[slicesTextField bind:@"value" toObject:controller withKeyPath:@"content" options:nil];
[stepperControl bind:@"value" toObject:controller withKeyPath:@"content" options:nil];

Точно так же, как:

[slicesTextField bind:@"value" toObject:self withKeyPath:@"numberOfPieSlices" options:nil];
    [stepperControl bind:@"value" toObject:self withKeyPath:@"numberOfPieSlices" options:nil];

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

  • ключевой путь для контроллера - это объект, и для его свойств требуется привязка других элементов управлениядело не в его значении, как в случае с примитивами и обертками вокруг них (в моем случае numberOfPiesSlices - NSInteger)

  • или когда необходимо связывание с другими внешними объектами, а не только между объектамиодин

Кто-нибудь может подтвердить или опровергнуть это?

Ответы [ 2 ]

10 голосов
/ 27 декабря 2011

Одним из преимуществ / точек привязки является устранение кода.Для этого NSObjectController и т. Д. Имеют то преимущество, что их можно использовать непосредственно в конструкторе интерфейсов и устанавливать с привязками к различным элементам пользовательского интерфейса.

Привязки представляют только часть предлагаемой функциональности.Классы * ObjectController также могут автоматически позаботиться о многих других более повторяющихся кодах контроллера (как в модели, представлении, контроллере), которые обычно требуются приложению.Например, они могут:

  • подключиться к вашему базовому хранилищу данных и выполнить необходимые выборки, вставки и удаления
  • управлять стеком отмены / повторного выполнения
  • Забрать отредактированныйно не фиксируйте изменения в вашем пользовательском интерфейсе и сохраняйте их (например, если окно закрыто, а фокус все еще находится на отредактированном текстовом поле - это было для меня новым, я нашел его из ответа mmalc в теме ниже).

Если вы ничего не делаете, тогда, вероятно, не стоит , стоит использовать NSObjectController.Его подклассы (NSArrayController и т. Д.) Более полезны.

Также см. здесь для обсуждения вашего точного вопроса!

4 голосов
/ 28 мая 2015

Зачем нужен NSObjectController, если я могу устанавливать привязки напрямую?

Я прочитал этот вопрос несколько дней назад, когда искал некоторую информацию о NSObjectController, и сегодня, продолжая поиск, янашел следующий отрывок , который, казалось, имел отношение к вопросу:

Существуют преимущества, если объект, к которому привязан объект, реализует NSEditorRegistration.Это одна из причин, по которой рекомендуется связывать объекты контроллера, а не напрямую с моделью.NSEditorRegistration позволяет привязке сообщать контроллеру, что его содержимое находится в процессе редактирования.Контроллер отслеживает, какие представления в настоящее время редактируют содержимое контроллера.Например, если пользователь закрывает окно, каждый контроллер, связанный с этим окном, может сказать всем таким представлениям немедленно зафиксировать ожидающие изменения, и, таким образом, пользователь не потеряет никакие данные.Apple предоставляет некоторые универсальные объекты контроллера (NSObjectController, NSArrayController, NSTreeController), которые можно использовать для переноса объектов модели, предоставляя функции регистрации редактора.

Использование контроллера также имеет то преимущество, что система привязок не непосредственно наблюдает за объектом вашей модели - поэтому, если вы замените объект модели новым (например, в подробном представлении, где пользователь изменилпроверяемой записи), вы можете просто заменить объект модели внутри контроллера, уведомления KVO и обновления привязки.

...