3

我创建了一个名为 的自定义类RCTextField,其目的是创建一个NSTextField圆角(因此RC...)。

RCTextField继承NSTextField并覆盖了该drawRect:方法,以创建自己的圆角矩形。

现在,我想为 做同样的事情NSSecureTextField,即有办法让它有圆角。我不能让它继承RCTextField,因为它没有任何安全的文本实现NSSecureTextField

如果我继承自NSSecureTextField,我将不得不drawRect:再次重写所有实现。

我想到的一个选项是有一个RCBaseTextField包含一个名为 的静态方法的类,并在和drawRect:forNSTextField:withParams:中调用该drawRect:方法。然而,这似乎有点骇人听闻,感觉在 Objective-C 中可能有更好的 OOP 方式来做到这一点。RCTextFieldRCSecureTextField

那么,从RCTextFieldanRCTextField和 an之间共享圆角代码的最佳/最理智/软件工程-“esquest”方式是RCSecureTextField什么?

4

5 回答 5

1

我发现对象组合有助于解决这种情况。将所有共享的方法移动到一个单独的类中,然后同时拥有RCTextFieldRCSecureTextField满足您的助手类并适当地调用这些方法。

于 2012-07-09T12:59:41.720 回答
1

用这个原型制作一个 C 函数:

void drawTextFieldRoundRect(NSTextField* instance, CGRect rect);

在名为 (say) 的文件中声明TextFieldRounded.h并在相应的文件中定义TextFieldRounded.m(不包含类,仅包含此 C 函数。但将其设为 .m 以便您可以使用 Objective-C 语法)。

在此函数中,您执行自定义绘图。您可以通过参数访问“自我” instance

接下来,在RCTextField你实现-drawRect:这样的:

#import "TextFieldRounded.h"

- (void) drawRect:(CGRect) rect
{
    drawTextFieldRoundRect(self, rect);
}

(对 做同样的事情RCSecureTextField

不是最优雅的,我知道...

选项 2:如果您只使用圆角文本字段则可以在 NSTextField 上添加一个类别,并且 NSSecureTextField 应该继承“圆角”行为。但是如果你想要圆形普通的文本字段,它就做不到。

于 2012-07-09T13:02:35.630 回答
1

听起来像是依赖注入的案例(注意:NSSecureTextField 继承自 NSTextField):

@interface RCTextField : NSObject {
  NSTextField *textField
}
- (id) initWithTextField:(NSTextField *)_textField;

@end

然后只公开你想要的任何功能。

于 2012-07-09T13:06:03.940 回答
1

不幸的是,你不能让一个 Objective-C 继承更多的其他类的行为。我认为提供一个将由两个drawRect:实现调用的函数(使用面向对象的语言并不会阻止在适当的时候使用函数)是更简单的方法。

或者您可能只是忽略NSSecureTextFieldRCSecureTextField继承自RCTextField. 然后实现类方法cellClass返回NSSecureTextFieldCell,你应该得到与NSSecureTextField.

@interface RCSecureTextField : RCTextField
@结尾

@implementation RCSecureTextField
+ (Class)cellClass { return [NSSecureTextFieldCell 类]; }
@结尾

于 2012-07-09T13:10:45.610 回答
1

您可能想要子类NSTextFieldCell化,而不是控件。我将子类化NSSecureTextFieldCell并在两个控件中使用它;从绘图的角度来看,唯一的区别是echosBullets财产的价值。

于 2012-07-09T13:11:02.093 回答