Почему использование NSObjectController

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

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

Однако у меня есть один очень прямой и конкретный вопрос: зачем нужен 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)

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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