我创建了一个名为RCTextField
的自定义类,其目的是创建一个带圆角的NSTextField
(因此RC...
)。
此RCTextField
继承自NSTextField
并覆盖drawRect:
方法,以创建自己的圆角矩形。
现在,我想为NSSecureTextField
做同样的事情,也就是说,有办法让它有圆角。我不能让它继承RCTextField
,因为那个NSSecureTextField
的文本没有任何安全实现。
如果我从NSSecureTextField
继承,我将不得不重新编写所有drawRect:
实现。
我想到的一个选项是拥有一个RCBaseTextField
类,其中包含一个名为drawRect:forNSTextField:withParams:
的静态方法,并在drawRect:
RCTextField
和RCSecureTextField
中调用该方法{1}}。然而,这看起来有点像hackish,并且感觉在Objective-C中可以有更好的OOP方式来做到这一点。
那么,在RCTextField
和RCTextField
之间分享来自RCSecureTextField
的绘制圆角代码的最佳/最佳/软件工程 - “esquest”方式是什么? ?
答案 0 :(得分:1)
我发现对象组合可以帮助解决这类问题。将所有共享的方法移动到一个单独的类中,然后让RCTextField
和RCSecureTextField
对您的助手类进行内容并适当地调用方法。
答案 1 :(得分:1)
使用此原型制作C函数:
void drawTextFieldRoundRect(NSTextField* instance, CGRect rect);
在一个名为(例如)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应继承“舍入”行为。但是,如果你想要圆形的和普通文本字段,它就不能这样做。
答案 2 :(得分:1)
听起来像依赖注入的情况(注意:NSSecureTextField继承自NSTextField):
@interface RCTextField : NSObject {
NSTextField *textField
}
- (id) initWithTextField:(NSTextField *)_textField;
@end
然后公开你想要的任何功能。
答案 3 :(得分:1)
不幸的是,你不能从另外一个类中创建一个Objective-C继承行为。我认为提供一个函数(使用面向对象的语言并不妨碍在适当的时候使用函数)将由drawRect:
实现调用是更简单的方法。
或者您可以忽略NSSecureTextField
并使RCSecureTextField
继承自RCTextField
。然后实现类方法cellClass
以返回NSSecureTextFieldCell
,您应该获得与NSSecureTextField
完全相同的功能。
@interface RCSecureTextField : RCTextField @end @implementation RCSecureTextField + (Class)cellClass { return [NSSecureTextFieldCell class]; } @end
答案 4 :(得分:1)
您可能希望继承NSTextFieldCell
,而不是控件。我会继承NSSecureTextFieldCell
并在两个控件中使用它;从绘图的角度来看,唯一的区别是echosBullets
属性的值。