有效地访问众多Cocoa控件

时间:2009-05-19 11:42:53

标签: objective-c cocoa user-interface

我有一个包含大量控件的界面,请参见下图。

Interface http://www.richardstelling.com/hosted/cocoainterface.png

访问这些内容的最佳方式是什么,在我的IBOutlets课程中创建288 AppController并将它们全部链接起来似乎效率低下。

我看了表格,但似乎很简单。

这是一个概念验证,不会发货,所以我对任何想法持开放态度。但有一点需要注意,我必须使用Objective-C作为最终产品,用Objective-C / Cocoa编写。

注意:

  1. 界面是静态的
  2. 较小的盒装将保留整数(0-255)

4 个答案:

答案 0 :(得分:6)

你应该研究NSMatrix。这正是它旨在解决的问题。

答案 1 :(得分:3)

NSTableView看起来像您需要的UI。视觉渲染会有所不同,但看起来会更像“Mac”。

答案 2 :(得分:2)

正如Rob建议的那样NSMatrix,或者重新考虑用户界面,因此你对它的控制较少: - )

答案 3 :(得分:0)

您可以通过编程方式构建整个界面,循环中包含几行代码:

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);
}