NSPopUpButton, привязки и сокращение срока службы - PullRequest
7 голосов
/ 10 апреля 2009

Я пытаюсь понять, насколько сложно использовать NSPopUpButton. Это, безусловно, самый сложный пользовательский элемент для программирования в Какао (по крайней мере, насколько я его нахожу).

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

  • У меня есть класс с именем Port, представляющий последовательный порт.
  • Среди атрибутов есть поле имени.
  • В NSPopUpButton я хочу отобразить поле имени для каждого порта.
  • Когда пользователь выбирает определенный порт, он отмечается во всплывающем окне, как и ожидалось
  • Когда пользователь впоследствии нажимает кнопку подключения, я могу определить, какой из портов был выбран из массива.
  • Я бы хотел добиться этого, используя привязки, так как думаю, что как только я обдумаю его, это будет более элегантное решение.

Поэтому в моем AppController.h я ожидаю два атрибута, которые я могу предположительно создать как свойства и синтезировать:

NSMutableArray *allPorts;
Port *currentlySelectedPort;

и одно действие в моем .m:

-(void)didSelectConnect:(id)sender{
    NSLog(@"Selected port name is:%@",[currentlySelectedPort name]);
}

в Port.h у меня

NSString *name;
NSString *baudRate;
... etc ...

Я создал простой проект, который содержит только всплывающее окно (и метку), и после различных статей мне удалось заполнить NSMutableArray элементами, которые я затем использую ArrayController для отображения значений, а затем при выборе устанавливаю значение метки (используя контроллер объекта). Однако, насколько это умно, это не соответствует сценарию использования, который я пытаюсь реализовать. Поэтому я обращаюсь за помощью

M

Ответы [ 2 ]

12 голосов
/ 10 апреля 2009

ОК, привязки с NSPopUpButton немного сложны, потому что для этого есть две вещи: привязка для значений и привязка, для которой выбрано одно из этих значений. Что делает его еще более сложным, так это то, что есть несколько совершенно законных способов сделать это, и какой из них вы выберете, полностью зависит от структуры вашей программы и, в некоторой степени, от личных предпочтений.

Итак, чтобы получить список значений, необходимо связать свойство content. В вашем случае вы, вероятно, связали бы это с arrangedObjects ключом NSArrayController. В этой настройке каждый пункт меню представляет один объект. По умолчанию заголовком пункта меню является строка, возвращаемая путем вызова description для каждого элемента в массиве. Если вы хотите использовать другое свойство для заголовка меню, вы также можете связать массив contentValues. Просто убедитесь, что путь к ключу, указанный вами для contentValues, содержит путь ключа для content в качестве префикса (например, вы можете использовать arrangedObjects для content и arrangedObjects.name для contentValues)

Это даст вам пункты меню, которые представляют объекты. Далее вам нужен какой-то способ идентификации выбранного. Вы можете использовать три разные привязки: selectedIndex, selectedObject и selectedValue. Они представляют, соответственно, индекс объекта массива, выбранного пользователем, значение объекта (один из объектов в массиве content) и заголовок строки выбранного элемента (один из объектов в contentValues). массив, если вы связали это свойство).

Итак, в вашем случае вы можете привязать selectedObject к свойству selectedSerialPort в вашем классе контроллера. Когда пользователь нажимает кнопку «Подключиться», вам нужно только обратиться к свойству selectedSerialPort.

6 голосов
/ 10 апреля 2009

Вы можете скачать пример проекта Xcode здесь . Это как можно ближе к твоему описанию.

Важно посмотреть на связи между контроллером массива, AppController и всплывающим окном.

По сути, это просто демонстрирует, что сказала Алекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...