NSTextField - Subclassing&drawRect导致文本无法加载

Ale*_*ant 4 macos cocoa objective-c

试图弄清楚NSTextField的边界(左上角的小黑框):http://cl.ly/image/2V2L1u3b3u0G

所以我将NSTextField子类化:

MYTextField.h

#import <Cocoa/Cocoa.h>
@interface HATrackCounterField : NSTextField
@end
Run Code Online (Sandbox Code Playgroud)

MYTextField.m

#import "HATrackCounterField.h"
@implementation HATrackCounterField
- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {}
    return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
    [[NSColor blackColor] setFill];
    [[NSBezierPath bezierPathWithRoundedRect:dirtyRect xRadius:3.0 yRadius:3.0] fill];
}

@end
Run Code Online (Sandbox Code Playgroud)

现在它没有显示文本字段文本:http://cl.ly/image/1J2W3K431C04

我是Objective-c的新手,看起来这应该很容易,所以我可能只是做错了...

谢谢!

注意:我正在通过集合视图设置文本,我setStringValue:在不同的点尝试也无济于事.

Dmi*_*try 5

您的文本字段文本未显示,因为您覆盖-drawRect并且未[super drawRect:dirtyRect]在其中调用.

在你的情况下,我认为做你想要的最简单的方法是使用剪辑蒙版:只需NSTextField执行绘制ant然后剪辑区域:

- (void)drawRect:(NSRect)dirtyRect
{
    [NSGraphicsContext saveGraphicsState];
    [[NSBezierPath bezierPathWithRoundedRect:dirtyRect xRadius:3.0 yRadius:3.0] setClip];
    [super drawRect:dirtyRect];
    [NSGraphicsContext restoreGraphicsState];
}
Run Code Online (Sandbox Code Playgroud)

通常,最好使用子类NSTextFieldCell来进行自定义绘制,因为单元格负责绘制.