相当于XCode中的“ListBox”?

时间:2011-06-14 02:42:39

标签: objective-c xcode cocoa

你知道Visual Studio,那个叫做“ListBox”的很棒的元素吗?只是一个列出一堆字符串的框。

我现在正在使用XCode,我在界面构建器“NSScrollView”中找到了这个类。它似乎能够列出几个字符串。它说它里面有一个NSTextView,但是,我如何访问它?

我甚至不确定NSScrollView是否是我需要的正确解决方案,但如果我可以简单地访问其中的NSTextView,我认为这就足够了。

3 个答案:

答案 0 :(得分:3)

请参阅NSTableView

至于在滚动视图中进入文本视图,创建一个Interface Builder插座(IBOutlet)并将其连接到文本视图本身,而不是滚动视图。

答案 1 :(得分:1)

进入滚动视图内的文本视图;您需要选择定义了插座的控制器;单击并按住控件,然后将蓝色连接线从控制器拖动到滚动视图的顶行;然后等待蓝线出现;然后,这将提示您将插座链接到文本视图。

答案 2 :(得分:0)

Josh上面的答案使用NSTableView是正确的。对于那些不熟悉它的人来说,它看起来像是一个比它实际上要大得多的任务。希望这能节省一些时间。

您可以创建任何类型的简单视图,并使用自动布局(甚至返回一个简单的NSTextView,而不是与NSTableCellView假设作斗争。这是我为了更好地控制文本布局而采取的措施字符串:

@interface PreferenceTableViewCell : NSView
@property (nonnull, strong, readonly) NSTextField *tf;
@end

@implementation PreferenceTableViewCell
-(id)init
{
    self = [super init];
    if(self) {
        self.translatesAutoresizingMaskIntoConstraints = NO;
        self.autoresizesSubviews = YES;
        _tf = [NSTextField labelWithString:@""];
        _ tf.translatesAutoresizingMaskIntoConstraints = NO;
        _tf.autoresizesSubviews = YES;
        [self addSubview:_tf];
        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(10)-[_tf]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_tf)]];
        [self addConstraint:[NSLayoutConstraint constraintWithItem:_tf attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]];
    }
    return self;
}
@end

然后把这个你需要的字符串列表(或控件,或其他):

_tv = [NSTableView new];
_tv.translatesAutoresizingMaskIntoConstraints = NO;
_tv.autoresizesSubviews = YES;
_tv.focusRingType = NSFocusRingTypeNone;
_tv.delegate = self;
_tv.dataSource = self;
_tv.rowHeight = 40; // Use this to adjust the height of your cell or do it in cell.
_tv.headerView = nil;
_tv.selectionHighlightStyle = NSTableViewSelectionHighlightStyleRegular;
_tv.allowsColumnReordering = NO;
_tv.allowsColumnResizing = NO;
_tv.allowsEmptySelection = NO;
_tv.allowsTypeSelect = NO;
_tv.gridStyleMask = NSTableViewGridNone;
[panel addSubview:_tv];

// TableView Column
NSTableColumn *col1 = [[NSTableColumn alloc] initWithIdentifier:@"c1"];
col1.resizingMask = NSTableColumnAutoresizingMask;
[_tv addTableColumn:col1];

然后在NSTableView的委托和数据源设置的任何内容中添加以下方法:

-(NSInteger)numberOfRowsInTableView:(NSTableView *)tv
{
   return stringArray.count;
}

-(NSView *)tableView:(NSTableView *)tv viewForTableColumn:(NSTableColumn *)tc row:(NSInteger)row
{
    // This can be ANY NSView based control built as shown above.
    PreferenceTableViewCell *cell = [PreferenceTableViewCell new];
    cell.tf.stringValue = stringArray[row];        
    return cell;
}

-(void)tableViewSelectionDidChange:(NSNotification *)notification
{
    // Code to do whatever when a list item is selected.
}

这基本上是一个简单的列表。有关如何将表绑定到数据源以及更复杂的问题的更多详细信息,请参阅NSTableView上的Apple Docs。