NSTableView не сохраняет NSTableCellView - PullRequest
0 голосов
/ 11 мая 2018

Это очень простой NSTableView с 1 столбцом и строками, состоящими из NSTableCellViews, которые отображают простую строку и которые я настраиваю программно (без nib / построителя интерфейса).

Я не могу заставить просмотр таблицы отображать строки и не могу понять, почему ?! И когда я ловлю событие выбора строки после отображения таблицы, объект ячейки равен nil?!

Я, должно быть, делаю что-то невероятно глупое, но я не вижу этого. Есть мысли?

@implementation PreferencesSelectorPanel
-(id)initWithWidth:(CGFloat)width
{
    self = [super init];
    if(self) {
        self.translatesAutoresizingMaskIntoConstraints = NO;
        self.autoresizesSubviews = YES;

        _preferenceTypes = @[@"Settings 1", @"Settings 2", @"Settings 3", @"Settings 4", @"Settings 5"];

        _tv = [NSTableView new];
        _tv.translatesAutoresizingMaskIntoConstraints = NO;
        _tv.autoresizesSubviews = YES;
        _tv.focusRingType = NSFocusRingTypeNone;
        _tv.delegate = self;
        _tv.dataSource = self;
        _tv.rowHeight = 40;
        _tv.headerView = nil;
        _tv.selectionHighlightStyle = NSTableViewSelectionHighlightStyleRegular;
        _tv.allowsColumnReordering = NO;
        _tv.allowsColumnResizing = NO;
        _tv.allowsEmptySelection = NO;
        _tv.allowsTypeSelect = NO;
        _tv.gridStyleMask = NSTableViewSolidHorizontalGridLineMask;//NSTableViewGridNone;

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

        [self addSubview:_tv];

        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(10)-[_tv(200)]-(>=10)-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_tv)]];
        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(10)-[_tv]-(10)-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_tv)]];
    }
    return self;
}

-(NSInteger)numberOfRowsInTableView:(NSTableView *)tv
{
    NSLog(@"numberOfRowsInTableView");
    return _preferenceTypes.count;
}

-(NSView *)tableView:(NSTableView *)tv viewForTableColumn:(NSTableColumn *)tc row:(NSInteger)row
{
    NSTextField *tf = [NSTextField 
    labelWithString:_preferenceTypes[row]];
    tf.textColor = [NSColor blackColor];

    NSTableCellView *cell = [NSTableCellView new];
    cell.textField = tf;

    NSLog(@"Row for row %d with label:%@",(int)row, cell.textField.stringValue);
    return cell;
}

-(void)tableViewSelectionDidChange:(NSNotification *)notification
{
    NSTableCellView *cell = _tv.selectedCell;
    NSLog(@"%@", cell.textField.stringValue);
}
@end

Это то, что регистрируется на консоли. Я часами бродил по этому вопросу и уже никуда не попал:

2018-05-11 numberOfRowsInTableView
2018-05-11 Row for row 0 with label:Settings 1
2018-05-11 Row for row 1 with label:Settings 2
2018-05-11 Row for row 2 with label:Settings 3
2018-05-11 Row for row 3 with label:Settings 4
2018-05-11 Row for row 4 with label:Settings 5
2018-05-11 (null)
2018-05-11 (null)
2018-05-11 (null)

Вот что я получаю: enter image description here

1 Ответ

0 голосов
/ 12 мая 2018

Мне не удалось понять, в чем именно заключалась проблема.Я пришел к нескольким альтернативным решениям:

  1. Можно просто вернуть NSTextField из tableView:viewForTableColumn:row:
  2. Также можно добавить NSTextField в качестве subView к NSTableCellViewно благодаря этому у вас меньше контроля над макетом.
  3. Можно создать любой пользовательский элемент управления на основе NSView.

Я выбрал последнее и создал собственный NSView, который выглядел ивел себя именно так, как я хотел.Это то, что я сделал.

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...