3

というカスタム クラスを作成しましたRCTextField。その目的は、NSTextField角が丸い (つまりRC...) を作成することです。

これは、角の丸い独自の長方形を作成するために、メソッドをRCTextField継承しNSTextFieldてオーバーライドします。drawRect:

今、私は同じことをしたいと思っていますNSSecureTextField。つまり、角を丸くする方法があります。それを継承することはできませんRCTextField。なぜなら、それにはテキストの安全なNSSecureTextField実装がないからです。

から継承するとNSSecureTextField、すべてのdrawRect:実装をもう一度書き直す必要があります。

私が考えたオプションは、とRCBaseTextField呼ばれる静的メソッドを含むクラスを持ち、それを ofとdrawRect:forNSTextField:withParams:で呼び出すことです。ただし、これは少しハックなようで、Objective-C でこれを行うためのより良い OOP の方法があるように感じます。drawRect:RCTextFieldRCSecureTextField

では、と のRCTextField間から角を丸めたコードを共有するための最良の/正気の/ソフトウェア工学の「esquest」方法は何でしょうか?RCTextFieldRCSecureTextField

4

5 に答える 5

1

残念ながら、Objective-Cに他の複数のクラスから動作を継承させることはできません。drawRect:両方の実装によって呼び出される関数(オブジェクト指向言語を使用しても、適切なときに関数を使用することを妨げることはありません)を提供する方が簡単な方法だと思います。

または、無視NSSecureTextFieldしてRCSecureTextFieldから継承することもできますRCTextFieldcellClass次に、返すクラスメソッドを実装するNSSecureTextFieldCellと、とまったく同じ機能が得られるはずですNSSecureTextField

@interface RCSecureTextField:RCTextField
@終わり

@implementation RCSecureTextField
+(Class)cellClass {return [NSSecureTextFieldCell class]; }
@終わり

于 2012-07-09T13:10:45.610 に答える
1

コントロールではなく、サブクラス化することをお勧めしNSTextFieldCellます。サブクラスNSSecureTextFieldCell化して、両方のコントロールで使用します。描画の観点からは、唯一の違いはechosBulletsプロパティの値です。

于 2012-07-09T13:11:02.093 に答える
1

このプロトタイプでC関数を作成します。

void drawTextFieldRoundRect(NSTextField* instance, CGRect rect);

(たとえば)という名前のファイルで宣言TextFieldRounded.hされ、対応するファイルで定義されTextFieldRounded.mます(クラスは含まれず、このC関数のみが含まれます。ただし、Objective-C構文を使用できるように.mにします)。

この関数内で、カスタム描画を実行します。パラメータを介して「self」にアクセスできます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

このような状況では、オブジェクト構成が役立つことがわかりました。共有されているすべてのメソッドを別のクラスに移動してから、ヘルパー クラスの両方RCTextFieldを保持し、メソッドを適切に呼び出します。RCSecureTextField

于 2012-07-09T12:59:41.720 に答える