0

現時点では、クラスにこれらのメソッドがあり、正常に動作しているようです。これらのメソッドを継承するサブクラスを作成したいと考えています。私が抱えている問題は、3 番目の方法 (shiftViewUpForKeyboard) で、if ステートメントを別の UITextField にしたいことです (ミラーが現在の例です)。サブクラスのメソッドをオーバーライドするには、基本的に新しいコーディングで正確にコピーする必要があることを読みましたが、その小さなセクションを変更したい場合、それを行う最良の方法は何ですか? 前もって感謝します。

- (void) viewWillAppear:(BOOL)animated {

[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(shiftViewUpForKeyboard:)
                                             name: UIKeyboardWillShowNotification
                                           object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(shiftViewDownAfterKeyboard)
                                             name: UIKeyboardWillHideNotification
                                           object: nil];


}

- (void) viewDidDisappear:(BOOL)animated {
[[NSNotificationCenter defaultCenter] removeObserver: self
                                                name: UIKeyboardWillShowNotification
                                              object: nil];
[[NSNotificationCenter defaultCenter] removeObserver: self
                                                name: UIKeyboardWillHideNotification
                                              object: nil];


}

- (void) shiftViewUpForKeyboard: (NSNotification*) theNotification;
{
if(mirror.isEditing == YES)
{

CGRect keyboardFrame;
NSDictionary* userInfo = theNotification.userInfo;
keyboardSlideDuration = [[userInfo objectForKey: UIKeyboardAnimationDurationUserInfoKey] floatValue];
keyboardFrame = [[userInfo objectForKey: UIKeyboardFrameBeginUserInfoKey] CGRectValue];

UIInterfaceOrientation theStatusBarOrientation = [[UIApplication sharedApplication] statusBarOrientation];

if UIInterfaceOrientationIsLandscape(theStatusBarOrientation)
    keyboardShiftAmount = keyboardFrame.size.width;
else 
    keyboardShiftAmount = keyboardFrame.size.height;

[UIView beginAnimations: @"ShiftUp" context: nil];
[UIView setAnimationDuration: keyboardSlideDuration];
self.view.center = CGPointMake( self.view.center.x, self.view.center.y - keyboardShiftAmount);
[UIView commitAnimations];
viewShiftedForKeyboard = TRUE;
}
}
4

2 に答える 2

2

いずれにせよ、サブクラスの完全なメソッドをコピーしたくない場合、および小さなカスタマイズを追加する場合、他に考えられる唯一の方法は、元のクラスを変更することです。そのために、2 つの可能性を提案できます。

1)元のクラスに次のメソッドを作成できます。

-(UITextField *)keyboardShiftTextField
そして、このクラスで
mirror.isEditing
コード:

[[self keyboardShiftTextField] isEditing]

このような場合、2 つのクラスの唯一の違いは新しいメソッドの実装であり、元のクラスの場合は次のようになります。

-(UITextField *)keyboardShiftTextField {
return mirror;
}
サブクラスでは、これは正しいテキスト フィールドを返します。

2) 2 番目のアプローチは、デリゲート パターンの定義が必要なため、より洗練されています。これには、コードの観点からいくらかのオーバーヘッドが必要ですが、柔軟性が向上します。さらに、サブクラスを作成する唯一の理由がこの 3 番目のメソッドをオーバーライドすることだけである場合、デリゲート パターンを使用すると、「カスタム」作業がデリゲートによって行われるため、サブクラスの作成をまったく回避できます。オーバーライドするメソッドの数が複数ある場合でも、カスタマイズが必要なすべての部分をプロトコル セクションに移動することで、このメカニズムを使用できます。これは、Obj-C と Cocoa では非常に一般的な手法であり、多くの場合、一部のクラスの必要性が制限されます。通常、別の機能を提供したい場合はサブクラスを使用しますが、あなたの場合は別の機能を提供していません。

于 2012-04-28T21:37:07.370 に答える
1

通常のアプローチはhttp://en.wikipedia.org/wiki/Template_method_patternです。クラス間で異なるメソッドのビットだけを取り出し、それを別のメソッドにして、サブクラスでオーバーライドします。

[編集して追加...]別のアプローチ-コードをもっと見ないと、ここでうまく機能するかどうかわかりません-メソッドに渡されるパラメーターを変更するものを作成することです(または選択しますメソッドに渡されたパラメーター、またはその種類の何かに基づいています)。(通常、継承+ポリモーフィズムではなく、他のメカニズムを使用して、同様の動作を持つ複数のものの必要な効果を取得します。それらは同じクラスのインスタンスですが、異なるデータが与えられます。)

于 2012-04-28T21:15:49.323 に答える