Не могу понять, как сделать эту привязку какао - PullRequest
2 голосов
/ 11 декабря 2011

Я разработчик .net, который пытается научиться программировать какао на Mac. Я столкнулся с проблемой, которую, похоже, не могу понять или найти ответ.

Я создал следующие классы:

  • ITObject - подкласс NSObject
  • ITPlayer - подкласс ITObject
  • ITEnemy - подкласс ITObject

В моем файле MainMenu.xib есть окно, содержащее следующие элементы управления:

  • NSArrayController - связано с делегатом приложения (itObjects)
  • NSTableView - связан с NSArrayController (orgObjects)
  • NSTextBox - связан с тем же NSArrayController (selection.player)

itObjects - это NSMutableArray, который я использую для хранения любых классов ITObject. NSArrayController был настроен на использование ITObject в качестве класса. Когда я добавляю ITPlayer в свойство itObjects, текстовое поле не считывает свойство player.

Свойство player уникально для ITPlayer. Если свойство player не является частью класса, я хочу отобразить 'N/A' в текстовом поле, если оно есть, я хочу, чтобы привязка показала значение. Прямо сейчас это ничего не делает.

Подробнее об объектах:

Код для предметов выглядит так:

@interface ITObject:NSObject <NSCoding>{ 
     int initiativeRoll, initiativeBonus, initiativeKicker;
}
@property int initiativeRoll, initiativeBonus, initiativeKicker;
@property (readonly) int initiativeTotal, initiativeCalc;
@end

Это заголовочный файл для ITObject (очевидно). ITEnemy и ITPlayer настроены так (только пока).

@interface ITPLayer:ITOjbect <NSCoding>{
     NSString *player;
}
@property (copy) NSString *player;
@end

Метод init для ITPlayer настраивается в файле реализации следующим образом:

- (void)init{
     self = [super init]
     if (self){
          player = @"undefined";
     }
     return self;
}

Существует также метод initWithCoder:, но я еще не использовал его, поэтому не думаю, что это подозрительно.

Большое спасибо за помощь!

1 Ответ

3 голосов
/ 11 декабря 2011

Я обычно не рекомендую привязки, и определенно не сложные привязки, новым разработчикам Какао.К сожалению, привязки имеют тенденцию «ничего не делать», когда они неправильно настроены.Это делает их очень сложными для отладки даже для опытных разработчиков.Привязки работают очень хорошо, когда имеешь дело с большой страницей параметров конфигурации, связанной с NSUserDefaults, но из-за этого сложно создать сложный пользовательский интерфейс.

С другой стороны, ваша установка кажется очень странной.Владелец MainMenu.xib почти всегда должен быть NSApplication.Вместо того, что вы делаете, вы должны перетащить новый NSArrayController на вашу XIB и подключить его, как вы описали, но не делать его владельцем файла.

Я бы ожидал, что вывидя исключения в вашем журнале.Возможно "NSArrayController не отвечает на селектор setDelegate:" или тому подобное.Если вы видите это, то это потому, что файл по умолчанию MainMenu nib настроен для связи делегата приложения с владельцем файла.


Сначала просто небольшая цитата из Apple docs, чтобы подчеркнуть точку зрения о привязках:

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

Мне нравится слово "строго" в этом разделе.После многих лет разработки с привязками и без них я стараюсь избегать их, за исключением самых простых случаев (например, панелей настроек, где они невероятно полезны).

Без привязок вы будете следовать инструкциям в Заполнение табличных представлений на основе представлений программно .В основном вы будете реализовывать numberOfRowsInTableView: и (при условии 10.7+) tableView:viewForTableColumn:row:.Для каждой строки и столбца вы возвращаете представление, содержащее нужные вам данные.Это взято из iOS-подхода, очень приятный и чрезвычайно гибкий.

Если вам нужна предварительная версия 10.7, то все немного сложнее, но все же проще, чем привязки.См. Заполнение табличных представлений на основе ячеек .При этом используется NSCell, а не NSView.Если вам просто нужна простая таблица, отображающая строковые данные, это не сложно.Просто внедрите numberOfRowsInTableView: и tableView:objectValueForTableColumn:row:.Последний должен возвращать что-то, что может быть приведено в строку.

Если вам нужен пользовательский NSCell для pre-10.7, попробуйте его самостоятельно, используя документы, и тогда у вас, вероятно, будут некоторыеновые вопросы для публикации.

...