Binding связывание таблиц

Mac OS X

Имея источник данных и табличное представление NSTableView можно связать их не прибегая к написанию програмного кода, прямо в редакторе Interface Builder.

Итак реализуем, для начала, класс - источник данных.

mbCars.hmbCars.m
#import <Foundation/Foundation.h>
@interface mbCars : NSObject
{
  NSString *make;
  NSString *model;
  double v;
  NSInteger gear;
}
@property (copy)NSString* make;
@property (copy)NSString* model;
@property NSInteger gear;
@property double v;
@end
#import "mbCars.h"
@implementation mbCars
@synthesize make,model,v,gear;

- (id)init
{
  self = [super init];
  if (self) {
    make = @"new_make";
    model = @"enter_model";
    v = 2.5;
    gear = 6;
  }
  return self;
}

- (void)setNilValueForKey:(NSString *)key
{
  [self setValue:@"0" forKey:key];
}
@end

Внимание! Обратите внимание на метод setNilValueForKey:, реализованный в классе mbCars. Дело в том, что в Cocoa при работе с объектами с помощью технологии "ключ-значение", используемой Cocoa Bindings, для пустых значений элементов управления, в случае если связанное свойство объекта является скалярной величиной (например double или NSInteger) вызывается метод setNilValueForKey: корневого класса NSObject, который по умолчанию генерирует исключение с ошибкой, поэтому необходимо переопредилить этот метод, и в нашем случае мы устанавливаем для пустого значения - значение 0.

В Interface Builder к окну добавляем табличное представление NSTableView и две кнопки, для добавления и удаления записей в таблице, соответственно, как показано ниже.

NSTableView bindings xcode

В файле, декларирующем наше окно или вид создаем изменяемый массив NSMutableArray для хранения записей таблицы, и создаем для него свойство с помощью директивы @property в файле декларирования и @synthesize, например как показано ниже:

mbAppDelegate.hmbAppDelegate.m
#import <Cocoa/Cocoa.h>

@interface mbAppDelegate : NSObject <NSApplicationDelegate>
{
  NSMutableArray* arrayCars;
}
@property (assign) IBOutlet NSWindow *window;
@property (readonly)NSMutableArray* arrayCars;

@end
#import "mbAppDelegate.h"

@implementation mbAppDelegate

@synthesize window = _window;
@synthesize arrayCars;

- (void)applicationDidFinishLaunching:
    (NSNotification *)aNotification
{
  // Создаем изменяемый массив
  arrayCars = [NSMutableArray array];
}

@end

Далее возвращаемся в Interface Builder, и добавляем в набор используемых объектов Array Controller.

NSTableView bindings Array Controller

Выделяем добавленный Array Controller и переходим во вкладку инспектора атрибутов, в поле Class Name вводим наименование нашего класса с данными mbCars, затем переходим во вкладку Bindings inspector, выбираем Controller Content - Content Array - Bind to: - выбираем место, где храниться наш массив с данными для таблицы, в Model Key Path вводим имя свойства массива arrayCars

NSTableView bindings Attributes inspector

Далее переходим к конфигурированию нашей таблицы, а именно каждой отдельно взятой ее ячеке, для этого выделяем каждую ячейку таблицы и во вкладке Bindings inspector выбираем связывание значения (Value) с контроллером Array Controller, Controller Key оставляем в значении arrangedObjects, а значение Model Key Path вводим имя свойства объекта данных нашего класса mbCars, соответствующее каждому столбцу нашей таблицы.

NSTableView Bindings tablecell to a array controller

Далее свяжем действия от кнопок для добавления и удаления строк таблицы с соответствующими методами объекта Array Controller, как показано ниже.

NSTableView Bindings add and remove rows

Теперь запустим приложение и все должно заработать!

 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac