gpt4 book ai didi

cocoa - 如何创建一个 NSTextFieldCell,在编辑模式下显示自定义 View 而不是 NSTextField?

转载 作者:行者123 更新时间:2023-12-03 16:38:39 25 4
gpt4 key购买 nike

我有一个 tableView,有 3 列包含 NSTextFieldCell。一切都充满了绑定(bind)。

其中一列的单元格文本是经过计算的,不可直接编辑。对于本专栏,我希望当单元格进入编辑模式时,显示按钮或自定义 View 而不是文本字段
换句话说,我想要一个 NSCell ,在不被编辑时是一个 NSTextFieldCell ,并且在编辑时是一个 NSButtonCell (或自定义 View )正在编辑中。

有什么提示可以继续吗?

<小时/>

这是我尝试过的方法,但没有成功:

  • 尝试#1:

我子类化了 NSTextFieldCell 并覆盖 fieldEditorForView: 如下所示 => 问题是我返回的 NSButton 不响应 setDelegate: > 可能还有很多其他的东西。

- (NSTextView *)fieldEditorForView:(NSView *)aControlView {

NSTableView *tableView = (NSTableView *) aControlView;

// Manually computing column and row index for testing purposes
NSButton* button = [[NSButton alloc] initWithFrame:[tableView frameOfCellAtColumn:2 row:2]];

return (NSTextView *)button;
}
  • 尝试#2:

子类NSTextFieldCell并重写drawWithFrame: inView: =>此方法仅用于在不处于编辑模式时绘制单元格。

  • 尝试#3:

这条线索有一定的潜力,但我显然在这里遗漏了一些东西。
在我的窗口委托(delegate)中实现 windowWillReturnFieldEditor: toObject: ,并返回自定义字段编辑器。我似乎走在正确的轨道上,但我错过了一些东西。参数 anObject 从来都不是我的自定义单元格(我仔细检查过,它在 XIB 中定义正确)。

- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)anObject
{
if ([anObject isKindOfClass:[NSCellTextAndButtonAtEditTime class]])
{
NSLog(@"Going there");

NSButton* button = [[NSButton alloc] initWithFrame:CGRectMake(0, 0, 300, 20)];
button.title = @"test";

return button;
}
return nil;
}

最佳答案

在我看来,最好的方法是子类化 NSTextView,为自定义单元格创建一个新的自定义字段编辑器,然后覆盖 - (NSTextView *)fieldEditorForView:(NSView *)aControlView 在您的自定义单元中进行销售。看起来 NSTextFieldCell 的编辑器是 NSTextView 的期望几乎是强制性的,这可能就是您尝试返回按钮失败的原因。我编写了这个简短的示例,它显示一个按钮,当您按下该按钮时,它将文本字段单元格的值更新为当前时间并结束编辑。也许会有帮助:

@interface SOMyEditor : NSTextView
@end

@interface SOMyEditor ()
- (void)p_buttonPressed: (id)sender;
@end

@implementation SOMyEditor

- (id)initWithFrame:(NSRect)frameRect textContainer:(NSTextContainer *)container;
{
if (self = [super initWithFrame: frameRect textContainer:container])
{
NSButton* button = [[[NSButton alloc] initWithFrame: NSMakeRect(0,0,frameRect.size.width, frameRect.size.height)] autorelease];
button.title = @"Update Time!";
button.target = self;
button.action = @selector(p_buttonPressed:);
button.autoresizingMask |= NSViewWidthSizable | NSViewHeightSizable;
self.autoresizesSubviews = YES;
[self addSubview: button];
}
return self;
}

- (void)p_buttonPressed: (id)sender
{
NSString* string = [[NSDate date] description];
[self insertText: string];
[self didChangeText];
[self.window endEditingFor: self];
}

@end

然后让您的自定义单元类执行如下操作:

@interface SOMyCustomTextFieldCell : NSTextFieldCell
@end

@interface SOMyCustomTextFieldCell ()
@property (retain) NSTextView* fieldEditor;
@end

@implementation SOMyCustomTextFieldCell
@synthesize fieldEditor = _fieldEditor;

- (NSTextView *)fieldEditorForView:(NSView *)aControlView
{
if (nil == _fieldEditor)
{
_fieldEditor = [[SOMyEditor alloc] init];
_fieldEditor.fieldEditor = YES;
}

return self.fieldEditor;
}

- (void)dealloc
{
[_fieldEditor release];
[super dealloc];
}

@end

这里有一些技巧。首先,如前所述,只要单元格是 NSTextFieldCell,编辑器就必须是 NSTextView 的子类。 NSTextView 的子类化带来了很多样板行为(你知道,所有你通常想要的行为,并且可以通过使用 NSTextFieldCell 进行编辑免费获得)。如果您希望您的应用程序的行为不像文本编辑器一样,那么您最终需要做一些工作来禁用 NSTextView 的正常行为。

其次,当您重写 - (NSTextView *)fieldEditorForView:(NSView *)aControlView 时,重要的是它在多个调用中为同一单元格返回相同字段编辑器。如果您只是在每次调用该方法时创建一个新的 NSTextView,它将无法正常工作。

希望这有帮助!

关于cocoa - 如何创建一个 NSTextFieldCell,在编辑模式下显示自定义 View 而不是 NSTextField?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6902668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com