Как я могу привязать к пользовательскому представлению в Какао, используя Xcode 4? - PullRequest
13 голосов
/ 12 ноября 2011

Я новичок в написании приложений для Mac и работе с Cocoa, поэтому, пожалуйста, прости мое невежество.

Я ищу создание пользовательского представления, которое предоставляет некоторые свойства, которые затем я могу связать с NSObjectController. Поскольку это настраиваемое представление, инспектор привязок, очевидно, не перечисляет какие-либо из свойств, которые я добавил к представлению, которые затем можно связать с помощью Interface Builder.

Обратившись за помощью в Stackoverflow / Google, я наткнулся на пару возможных решений, но ни одно из них не подходит для моей ситуации. Первый предложил создать IBPlugin, что означало бы, что мои привязки будут доступны в Инспекторе привязок. Затем я мог бы связать представление с контроллером, используя IB. По-видимому, IBPlugins не поддерживаются в Xcode 4, так что вы выходите из окна. Я также предполагаю (возможно, ошибочно), что IBPlugins больше не поддерживаются, потому что в наши дни есть лучший способ сделать такие вещи?

Второй вариант заключался в том, чтобы программно привязать контроллер к представлению. Я немного сбит с толку относительно того, как именно я бы этого достиг. Требуется ли создание подкласса NSObjectController, чтобы я мог добавить вызовы для привязки к представлению? Нужно ли что-нибудь добавить в представление для поддержки этого? Некоторые примеры, которые я видел, говорят, что вам нужно переопределить метод bind, а другие говорят, что вы этого не делаете.

Кроме того, я заметил, что некоторые примеры пользовательских представлений вызывают [self exposeBinding:@"bindingName"] в инициализаторе. Из того, что я собираю из разных источников, это то, что связано с IBPlugins, и мне не нужно ничего делать, если я ими не пользуюсь. Это правильно?

Я нашел сообщение о Stackoverflow здесь , в котором обсуждается что-то очень похожее на мою проблему, но не было однозначного победителя относительно лучшего ответа. Последний комментарий Ноа 12 сентября кажется интересным, хотя они упоминают, что вы должны звонить exposeBinding:. Этот комментарий на правильном пути? Действительно ли необходим вызов exposeBinding?

Извинения за любые глупые вопросы. Любая помощь с благодарностью.

Ответы [ 2 ]

15 голосов
/ 12 ноября 2011

Первый предложил создать IBPlugin, что означало бы, что мои привязки будут доступны в Инспекторе привязок.Затем я мог бы связать представление с контроллером, используя IB.Очевидно, что IBPlugins не поддерживаются в Xcode 4, так что вы не можете их видеть.

Правильно.Интерфейсный Разработчик мертв;Да здравствует редактор пера XCode (который они до сих пор называют Интерфейсным Разработчиком).

С исчезновением IB, поэтому IBPlugins.

Я также предполагаю (возможно, неправильно), что IBPluginsбольше не поддерживаются, потому что в наши дни есть лучший способ сделать такие вещи?

Нет.

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

Отправить представление a bind:toObject:withKeyPath:options: сообщение .

Было бы этотребует подклассов NSObjectController, чтобы я мог добавить вызовы для привязки к представлению?

Не NSObjectController, но что-то, что либо владеет пером (например, контроллер окна или контроллер представления) или является верхним уровнемобъект внутри него (например, делегат приложения в кончике MainMenu).

Нужно ли добавить что-либо в представление для поддержки этого?

См. ниже.

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

Вы привыкли, для невзрачных просмотров(представления всегда работали без переопределения), но не больше.Вам больше не нужно переопределять метод bind::::.

Я не знаю, когда это изменилось, но я написал тестовое приложение для подтверждения текущего поведения (по состоянию на Snow Leopard иЛев).

Также я заметил, что некоторые примеры пользовательских представлений вызывают [self exposeBinding:@"bindingName"] в инициализаторе.Из того, что я собираю из разных источников, это то, что связано с IBPlugins, и мне не нужно ничего делать, если я ими не пользуюсь.Это правильно?

Нет.

Вам не нужно переопределять bind:::: для привязки к любому KVC- / KVO-совместимому свойству, и вам не нужноотправить exposeBinding:.

смущенно, документация гласит иначе : вы должны переопределить bind:::: и unbind:, даже в представлениях, и что exposeBinding: полезен для всего.

Все, что вам нужно сделать, чтобы создать доступную привязку, это реализовать свойство, совместимое с KVC / KVO.Если это синтезированный @property, это сделано.В противном случае см. здесь .

Затем отправьте представлению / объекту сообщение bind::::, чтобы фактически связать его, поскольку нет способа выставить привязку в редакторе пера.

TL; DR:

Просто реализуйте обычное свойство, и вы сможете связать его с a bind:toObject:withKeyPath:options: сообщением (по крайней мере, в Snow Leopard и Lion).Вам больше не нужно отправлять exposeBinding: из любого места.Вы не можете сделать так, чтобы пользовательские привязки отображались в редакторе пера в Xcode 4.

5 голосов
/ 30 сентября 2013

Чтобы уточнить / уточнить / прояснить ответ @ PeterHosey .. Я позволил себе разложить его тестовое приложение , пытаясь прояснить ТОЛЬКО способ, которым я смог выяснить, как связать представление свойства ... в "современный" (не) , Post-IBPlugin (RIP) эра ... Все приложение выполняется в 3 методах в подкласс NSView с некоторыми привязками.

enter image description here

Чтобы представление "обновляло представление" без необходимости возиться с установщиком свойства hueDegrees. Я просто делаю это ...

- (void) didChangeValueForKey:(NSString*)key {
     self.needsDisplay = YES; [super didChangeValueForKey:key]; }

Сделав это, и установив начальное значение свойства в IB следующим образом ...

enter image description here

Вы избавляетесь от большого количества клеевого кода. Для того, чтобы "Hue" NSTextField корректно обновлялся ... так как вы не можете "привязать" к представлению .. Я просто перетаскиваю NSViewController в "области объектов" и подключаю * 1026 контроллера вида * выход на вид в ИБ. Затем создайте привязку через контроллер представления.

enter image description here

Надеюсь, это поможет прояснить - с помощью довольно простого решения - эту плохо документированную / часто запутанную проблему.

...