Эффективный доступ к многочисленным элементам управления какао - PullRequest
1 голос
/ 19 мая 2009

У меня есть интерфейс с большим количеством элементов управления, см. Изображение ниже.

Интерфейс http://www.richardstelling.com/hosted/cocoainterface.png

Какой лучший способ получить к ним доступ, создать 288 IBOutlets в моем классе AppController и связать их все вместе, кажется неэффективным.

Я смотрел на формы, но они казались упрощенными.

Это подтверждение концепции и не будет отправлено, поэтому я открыт для любых идей. Однако, одно предупреждение: я должен использовать Objective-C, так как конечный продукт будет написан на Objective-C / Cocoa.

Примечание:

  1. Интерфейс статический
  2. Меньше в штучной упаковке будет содержать целые числа (0-255)

Ответы [ 4 ]

6 голосов
/ 19 мая 2009

Вы должны посмотреть на NSMatrix . Это именно то, что он предназначен для решения.

3 голосов
/ 19 мая 2009

NSTableView выглядит как необходимый вам интерфейс. Визуальный рендеринг будет немного другим, но он будет выглядеть более «Mac».

2 голосов
/ 19 мая 2009

Либо NSMatrix, как предлагает Роб, либо заново продумайте пользовательский интерфейс, чтобы у вас было меньше элементов управления им:

0 голосов
/ 20 мая 2009

Вы можете построить весь интерфейс программно, с несколькими строками кода в цикле:

const int numRows = 11;
const int rowWidth = 400;
const int rowHeight = 20;
const int itemSpacing = 5;
const int nameFieldWidth = 120;
const int smallFieldWidth = 30;

NSMutableArray * rowList = [[NSMutableArray alloc] initWithCapacity:numRows];

int rowIndex;
NSRect rowFrame = [controlView bounds];
rowFrame.origin.y = rowFrame.size.height - rowHeight;
rowFrame.size.height = rowHeight;
NSRect itemRect
for (rowIndex = 0; rowIndex < 11; rowIndex++)
{
    // create a new controller for the current row
    MyRowController * rowController = [[MyRowController alloc] init];
    [rowList addObject:rowController];
    [rowController release];

    // create and link the checkbox
    itemRect = rowFrame;
    itemRect.size.width = 20;
    NSButton * checkBox = [[NSButton alloc] initWithFrame:itemRect];
    [controlView addSubview:checkBox];
    [rowController setCheckBox:checkBox];
    [checkBox release];

    // create and link the name field
    itemRect.origin.x += itemRect.size.width + itemSpacing;
    itemRect.size.width = nameFieldWidth;
    NSTextField * nameField = [[NSTextField alloc] initWithFrame:itemRect];
    [controlView addSubview:nameField];
    [rowController setNameField:nameField];
    [nameField release];

    // create and link the smaller fields
    itemRect.origin.x += itemRect.size.width + itemSpacing;
    itemRect.size.width = smallFieldWidth;
    NSTextField * smallField_1 = [[NSTextField alloc] initWithFrame:itemRect];
    [controlView addSubview:smallField_1];
    [rowController setSmallField_1:smallField_1];
    [smallField_1 release];

    //.. continue for each item in a row ..

    // increment the main rectangle for the next loop
    rowFrame.origin.y -= (rowFrame.size.height + itemSpacing);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...