【问题标题】:Can't change column width of NSTableColumn无法更改 NSTableColumn 的列宽
【发布时间】:2021-02-24 20:36:03
【问题描述】:

我在NSScrollView 中嵌入了一个NSTableView,如example 所示,但由于某种原因,设置列宽只有在初始设置时才能正常工作。稍后更改它,即响应按钮单击,根本不会做任何事情。我是这样做的:

[col setMinWidth:1000];
[col setMaxWidth:1000];
[col setWidth:1000];

在这些调用 col.width 正确返回 1000 之后,NSTableView 没有显示更改。它看起来仍然像以前一样,即即使现在列宽为 1000 磅,较长的条目仍会使用 ... 截断。

我在更改列宽后尝试调用[tableView setNeedsDisplay:YES],但没有帮助。在NSScrollView 上调用setNeedsDisplay 也无济于事。我也试过玩NSTableColumnresizingMaskNSTableViewcolumnAutoresizingStyle,但都无济于事。尝试更改列宽在这里不起作用。有什么想法吗?

编辑

下面是代码供参考:

listDelegate = [[MyListDelegate alloc] initWithChoices:array];

scrollview = [[NSScrollView alloc] initWithFrame:NSMakeRect(20, 52, rect.size.width - 2 * 20, 200)];
tableview = [[NSTableView alloc] initWithFrame:NSMakeRect(0, 0, rect.size.width - 2 * 20 - 16, 200)];
column = [[NSTableColumn alloc] initWithIdentifier:@"Column"];

[column setWidth:400];
[tableview addTableColumn:column];
[tableview setHeaderView:nil];
[tableview setDelegate:listDelegate];
[tableview setDataSource:listDelegate];
[tableview reloadData];
[scrollview setDocumentView:tableview];
[scrollview setHasVerticalScroller:YES];
[scrollview setHasHorizontalScroller:YES];  
[[win contentView] addSubview:scrollview];
[scrollview release];
[column release];

列表委托如下所示:

@interface MyListDelegate : NSObject
{
    NSArray *choices;
}
    
- (id)initWithChoices:(NSArray *)c; 
@end

@implementation MyListDelegate

- (id)initWithChoices:(NSArray *)c
{
    if(!(self = [super init])) return nil;

    choices = c;
    
    return self;
}

- (int)numberOfRowsInTableView:(NSTableView *)_tableView
{
    return (int) [choices count];
}

- (id)tableView:(NSTableView *)_tableView objectValueForTableColumn:(NSTableColumn *) tableColumn row:(int)row
{
    return [choices objectAtIndex:row];
}

- (BOOL)tableView:(NSTableView *)_tableView shouldEditTableColumn:(NSTableColumn *) tableColumn row:(int)row
{
    return NO;
}   
@end

而当按钮被按下时,会执行以下代码:

NSTableColumn *col = [[tableview tableColumns] objectAtIndex:0];
[col setMinWidth:1000];
[col setMaxWidth:1000];
[col setWidth:1000];

【问题讨论】:

    标签: objective-c macos cocoa nstableview


    【解决方案1】:

    这是改变表格视图列宽的一种技术。

    #import <Cocoa/Cocoa.h>
    
    @interface AppDelegate : NSObject <NSApplicationDelegate, NSTableViewDelegate, NSTableViewDataSource> {
     NSWindow *window;
     NSTableColumn *column1;
    }
    - (void) myBtnAction;
    - (void) buildMenu;
    - (void) buildWindow;
    @end
    
    @implementation AppDelegate
    
    - (void) myBtnAction {
     [column1 setWidth:150];
    }
    
    - (void) buildMenu {
     NSMenu *menubar = [NSMenu new];
     NSMenuItem *menuBarItem = [NSMenuItem new];
     [menubar addItem:menuBarItem];
     [NSApp setMainMenu:menubar];
     NSMenu *appMenu = [NSMenu new];
     NSMenuItem *quitMenuItem = [[NSMenuItem alloc] initWithTitle:@"Quit" action:@selector(terminate:) keyEquivalent:@"q"];
     [appMenu addItem:quitMenuItem];
     [menuBarItem setSubmenu:appMenu];
    }
    
    - (void) buildWindow {
    
    #define _wndW  500
    #define _wndH  350
    
    window = [[NSWindow alloc] initWithContentRect: NSMakeRect( 0, 0, _wndW, _wndH )
    styleMask: NSWindowStyleMaskTitled | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable
    backing: NSBackingStoreBuffered defer: NO];
    
    [window center];
    [window setTitle: @"Test window"];
    [window makeKeyAndOrderFront: nil];
    
    // **** TableView_SO **** //
     NSScrollView *scrlView = [[NSScrollView alloc] initWithFrame:NSMakeRect(60, 100, 380, 200)];
     NSTableView *tableView = [[NSTableView alloc] initWithFrame:NSMakeRect(0, 0, 364, 200)];
    // create columns for our table
     column1 = [[NSTableColumn alloc] initWithIdentifier:@"Col1"];
     NSTableColumn * column2 = [[NSTableColumn alloc] initWithIdentifier:@"Col2"];
     [column1 setWidth:252];
     [column2 setWidth:198];
    // generally you want to add at least one column to the table view.
     [tableView addTableColumn:column1];
     [tableView addTableColumn:column2];
     [tableView setDelegate:self];
     [tableView setDataSource:self];
     [tableView reloadData];
    // embed table view in the scroll view, and add the scroll view to window.
     [scrlView setDocumentView:tableView];
     [scrlView setHasVerticalScroller:YES];
     [[window contentView] addSubview:scrlView];
    
    // **** Button **** //
    NSButton *myBtn =[[NSButton alloc]initWithFrame:NSMakeRect( 30, 30, 135, 30 )];
    [myBtn setBezelStyle:NSBezelStyleRounded ];
    [myBtn setTitle: @"Change Col1 Width"];
    [myBtn setAction: @selector (myBtnAction)];
    [[window contentView] addSubview: myBtn];
    
    // **** Quit btn **** //
    NSButton *quitBtn = [[NSButton alloc]initWithFrame:NSMakeRect( _wndW - 50, 5, 40, 40 )];
    [quitBtn setBezelStyle:NSBezelStyleCircular ];
    [quitBtn setTitle: @"Q" ];
    [quitBtn setAutoresizingMask: NSViewMinXMargin];
    [quitBtn setAction:@selector(terminate:)];
    [[window contentView] addSubview: quitBtn];
    }
    
    - (void) applicationWillFinishLaunching: (NSNotification *)notification {
    [self buildMenu];
    [self buildWindow];
    }
    
    - (void) applicationDidFinishLaunching: (NSNotification *)notification {
    
    }
    @end
    
    int main (){
     NSApplication *application = [NSApplication sharedApplication];
     AppDelegate *appDelegate = [[AppDelegate alloc] init];
     [application setDelegate:appDelegate];
     [application run];
    return 0;
    }
    
    

    【讨论】:

    • 表格视图被替换了吗?
    • @Willeke。好点子;我的解决方案已被编辑为仅更改列宽。
    • 所以答案是去掉setMinWidthsetMaxWidth?
    • @Willeke。最初的问题是如何更改表格列的列宽,这就是演示所显示的内容。最小和最大宽度可以用相同的技术改变。如果这是您的问题,则在更改 col 宽度时无需更改最小值和最大值。
    • 我认为问题是“为什么我的代码不起作用”,我想知道这个答案是如何回答这个问题的。
    【解决方案2】:

    对我来说它看起来像一个错误。 [col setMinWidth:1000] 也将宽度设置为1000,但不会更新表格视图。 [col setWidth:1000] 不做任何事情,因为宽度是 1000。修复:先设置宽度:

    [col setWidth:1000];
    [col setMinWidth:1000];
    [col setMaxWidth:1000];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 2017-10-09
      相关资源
      最近更新 更多