mac 纯代码创建tableview

本文介绍了 MacOS 下 TableView 的使用方法,包括 Container 的配置、TableView 的初始化、数据源设置、视图更新以及滚动监听等内容,并对比了 iOS 和 MacOS 中 TableView 的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iOS和Mac OS的tableview使用略有不同

Mac OS的tableView需要一个Container来包裹它,才可以滑动,而iOS的不用
Mac OS的tableview里面多了一个概念叫做column(列),而iOS中没有这个概念
iOS中有section的概念,可是Mac OS中没有(NSCollectionView中有)

注释:如果Mac开发中需求必需使用section的话,可以去研究下NSCollectionView

Mac os的tableview在datasource做视图的时候,有两种情况:
1、View Based TableView
2、Cell Based TableView
这两种情况可用的delegate方法不太相同,需要注意,否则可能出现delegate方法不被调用的问题

@interface AppDelegate ()<NSTableViewDataSource,NSTableViewDelegate>
{
    NSScrollView *_tableContainerView;
    NSMutableArray *_dataSourceArray;

    NSTextField *_scrollTF;
    NSButton *_deleteBtn;
    NSButton *_addBtn;

    NSInteger _selectedRowNum;
}
@property (weak) IBOutlet NSWindow *window;
@property (nonatomic) NSTableView *tableView;
@end

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    //虚拟的dataSource
    _dataSourceArray = [[NSMutableArray alloc] initWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9", nil];
    _selectedRowNum = -1;

    //删除按钮
    _deleteBtn = [[NSButton alloc] initWithFrame:CGRectMake(415, 250, 70, 25)];
    _deleteBtn.title = @"删除选中行";
    _deleteBtn.wantsLayer = YES;
    _deleteBtn.layer.cornerRadius = 3.0f;
    _deleteBtn.layer.borderColor = [NSColor lightGrayColor].CGColor;
    [_deleteBtn setTarget:self];
    _deleteBtn.action = @selector(deleteTheSelectedRow);
    [self.window.contentView addSubview:_deleteBtn];

    //添加按钮
    _addBtn = [[NSButton alloc] initWithFrame:CGRectMake(415, 170, 70, 25)];
    _addBtn.title = @"上面添一行";
    _addBtn.wantsLayer = YES;
    _addBtn.layer.cornerRadius = 3.0f;
    _addBtn.layer.borderColor = [NSColor lightGrayColor].CGColor;
    [_addBtn setTarget:self];
    _addBtn.action = @selector(addRowUnderTheSelectedRow);
    [self.window.contentView addSubview:_addBtn];

    //滚动显示的TF
    _scrollTF = [[NSTextField alloc] initWithFrame:CGRectMake(415, 90, 80, 15)];
    _scrollTF.stringValue = @"滚动 0.0";
    _scrollTF.font = [NSFont systemFontOfSize:15.0f];
    _scrollTF.textColor = [NSColor blackColor];
    _scrollTF.drawsBackground = NO;
    _scrollTF.bordered = NO;
    _scrollTF.focusRingType = NSFocusRingTypeNone;
    _scrollTF.editable = NO;
    [self.window.contentView addSubview:_scrollTF];

    //tableView
    _tableContainerView = [[NSScrollView alloc] initWithFrame:CGRectMake(0, 0, 400, 309)];
    _tableView = [[NSTableView alloc] initWithFrame:CGRectMake(0, 20,
                                                               _tableContainerView.frame.size.width-20,
                                                               _tableContainerView.frame.size.height)];
    [_tableView setBackgroundColor:[NSColor colorWithCalibratedRed:220.0/255 green:220.0/255 blue:220.0/255 alpha:1.0]];
    _tableView.focusRingType = NSFocusRingTypeNone;                             //tableview获得焦点时的风格
    _tableView.selectionHighlightStyle = NSTableViewSelectionHighlightStyleRegular;//行高亮的风格
    _tableView.headerView.frame = NSZeroRect;                                   //表头
    _tableView.delegate = self;
    _tableView.dataSource = self;

    // 第一列
    NSTableColumn * column1 = [[NSTableColumn alloc] initWithIdentifier:@"firstColumn"];
    [column1 setWidth:200];
    [_tableView addTableColumn:column1];//第一列

    // 第二列
    NSTableColumn * column2 = [[NSTableColumn alloc] initWithIdentifier:@"secondColumn"];
    [column2 setWidth:200];
    [_tableView addTableColumn:column2];//第二列

    [_tableContainerView setDocumentView:_tableView];
    [_tableContainerView setDrawsBackground:NO];        //不画背景(背景默认画成白色)
    [_tableContainerView setHasVerticalScroller:YES];   //有垂直滚动条
    //[_tableContainer setHasHorizontalScroller:YES];   //有水平滚动条
    _tableContainerView.autohidesScrollers = YES;       //自动隐藏滚动条(滚动的时候出现)
    [self.window.contentView addSubview:_tableContainerView];

    //监测tableview滚动
    [[NSNotificationCenter defaultCenter]addObserver:self
                                            selector:@selector(tableviewDidScroll:)
                                                name:NSViewBoundsDidChangeNotification
                                              object:[[_tableView enclosingScrollView] contentView]];
}
#pragma mark - NSTableViewDataSource,NSTableViewDelegate
#pragma mark -required methods
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
    return _dataSourceArray.count;
}
//这个方法虽然不返回什么东西,但是必须实现,不实现可能会出问题-比如行视图显示不出来等。(10.11貌似不实现也可以,可是10.10及以下还是不行的)
- (nullable id)tableView:(NSTableView *)tableView objectValueForTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row
{
    return nil;
}
#pragma mark -other methods
- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row
{
    return 58;
}
- (nullable NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row
{
    NSString *strIdt=[tableColumn identifier];
    NSTableCellView *aView = [tableView makeViewWithIdentifier:strIdt owner:self];
    if (!aView)
        aView = [[NSTableCellView alloc]initWithFrame:CGRectMake(0, 0, tableColumn.width, 58)];
    else
        for (NSView *view in aView.subviews)[view removeFromSuperview];

    NSTextField *textField = [[NSTextField alloc] initWithFrame:CGRectMake(15, 20, 156+50, 17)];
    textField.stringValue = [NSString stringWithFormat:@"%@-ºµº-%@",tableColumn.identifier,[_dataSourceArray objectAtIndex:row]];
    textField.font = [NSFont systemFontOfSize:15.0f];
    textField.textColor = [NSColor blackColor];
    textField.drawsBackground = NO;
    textField.bordered = NO;
    textField.focusRingType = NSFocusRingTypeNone;
    textField.editable = NO;
    [aView addSubview:textField];
    return aView;
}
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row
{
//    NSLog(@"====%ld", (long)row);
    _selectedRowNum = row;
    return YES;
}

- (void)tableView:(NSTableView *)tableView didClickTableColumn:(NSTableColumn *)tableColumn{
    NSLog(@"%@", tableColumn.dataCell);
}
#pragma mark - tableview滚动处理
-(void)tableviewDidScroll:(NSNotification *)notification
{
    NSClipView *contentView = [notification object];
    CGFloat scrollY = contentView.visibleRect.origin.y-20;//这里减去20是因为tableHeader的20高度
    _scrollTF.stringValue = [NSString stringWithFormat:@"滚动 %.1f",scrollY];
}


#pragma mark - 删除&&添加某一行
-(void)deleteTheSelectedRow
{
    if (_selectedRowNum == -1) {NSLog(@"请先选择要删除的行"); return;}
    [_tableView beginUpdates];
    [_dataSourceArray removeObjectAtIndex:_selectedRowNum];
    [_tableView removeRowsAtIndexes:[NSIndexSet indexSetWithIndex:_selectedRowNum] withAnimation:NSTableViewAnimationSlideUp];
    [_tableView endUpdates];
    _selectedRowNum = -1;
}
-(void)addRowUnderTheSelectedRow
{
    if (_selectedRowNum == -1) {NSLog(@"请先选择要哪行上面添一行"); return;}
    NSString *seletedDataObject = [_dataSourceArray objectAtIndex:_selectedRowNum];
    NSString *addObject = [NSString stringWithFormat:@"%@+",seletedDataObject];

    [_tableView beginUpdates];
    [_dataSourceArray insertObject:addObject atIndex:_selectedRowNum];
    [_tableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:_selectedRowNum] withAnimation:NSTableViewAnimationSlideDown];
    [_tableView endUpdates];
    _selectedRowNum++;
}
#pragma mark -
- (void)applicationWillTerminate:(NSNotification *)aNotification {
    // Insert code here to tear down your application
}
// 选中的响应
-(void)tableViewSelectionDidChange:(nonnull NSNotification* )notification{
    self.tableView = notification.object;
    //do something
    NSLog(@"-----%ld", (long)self.tableView.selectedRow);
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值