2013-06-04 1 views
0

Я разделил свой интерфейс на различные файлы nib.Программный эквивалент привязки nsarraycontroller к nsobjectcontroller, выбору, содержимому

сейчас, я использую два подкласса nswindowcontroller с nsarraycontroller и nsobjectcontroller IBOutlets. Контроллеры nindindow являются владельцем файла в их соответствующих наконечках.

Контроллеры назначаются в IntefaceBuilder (IB).

ранее в одном кончика пера, я имел привязку от сотрудников nsarraycontroller для одного сотрудника nsobjectcontroller, используя controllerkey из «выбора» и modelkeypath от «я»

сейчас, я стараюсь «связывать» их с помощью кода, так как такие

- (IBOutlet) showEmployeeWindow:(id)sender; 

//load a window from a nib file. 
    ... 

// Get the employee arraycontroller. 
NSArrayController *employeesController = [employeesWindowController employeeArrayController]; 

// Get the selected employee from the employeeS controller 
id employee = [empController selection]; 

//now the employee 
NSObjectController *emplController = [singleEmployeeWindowController employeeController]; 

//Set the content object of the employee controller as the nsset called employees. 
[emplController setContent: employee]; 

//Show the window. 
[singleEmployeeWindowController showWindow:sender]; 

    ... 

}

проблему.

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

id employee = [empController selection]; 
// Get the selected employee from the employeeS controller 

кажется, чтобы получить другой сотрудник.

но Я постоянно вижу первого сотрудника, никогда не выбранного.

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

Обратите внимание, что каждый nswindowcontroller имеет контекст nsmanagedobject через nsdocument. его владельца файла в наконечнике.

ответ

4

Разве это не так. после 2 дней вытягивания волос. задайте вопрос и ответьте на ответ в течение 1/2 часа.

Так секрет, по существу, переплеты какао, и, в частности Key Value Bindings

Эта документация является типичной yackademic ядда ядда. Каскадная подсказка на самом деле произошла от a similar stack overflow question

Итак, все, что нужно сделать, это связать два контроллера вместе вот так.

NSArrayController *source = [employeesWindowController employeeArrayController]]; 
NSObjectController *destination = [singleEmployeeWindowController employeeController]; 

[destination bind:@"contentObject" toObject:source withKeyPath:@"selection.self" options:nil]; 

Синтаксис следует за строками привязок интерфейса.

Bind to: Content Object 
Content Key: selection 
ModelKeyPath: self 

Таким образом, это прочный легкий лайнер.

Связывание a NSLabel с контроллером. В IB

Bind to: Value 
Content Key: selection 
ModelKeyPath: name 

В коде,

[label bind:@"value" toObject:controllerRef withKeyPath:@"selection.name" options:nil]; 

и варианты сходны с «Поднимает Не применимо ключи» и так далее. Подробнее см. Yackademic text.

+0

Я был готов понравиться этот ответ, но код, который вы даете, не только даст ошибки, но и обманет других разработчиков. Например, @ "selection.self" неверен на нескольких уровнях. –

+0

Спасибо! Достаточно информации, чтобы помочь мне понять цель каждого из аргументов bind. – RichS

+0

Спасибо, привязка к keyPath «selection.self» вместо «selection» была ключом для моего дела. Вместо «contentObject» я использовал константу «NSContentBinding» в AppKit. – Andrew