6

私はいくつかの Objective-C コードを書いていますが、一度だけ使用する値を格納するためにクラス変数を使用しなければならない状況に頻繁に遭遇しました。それを消費した後、私はもうそれを必要としません。私には、この値をクラス変数に格納するのはコードの匂いのように思えます。実際には、使用しているメソッドにパラメーターとして値を渡す必要があります。

私は通常、デリゲートを消費しているときにこれに出くわします。UIActionSheet例として、タップされたときにロードして表示するために使用される複数のボタンを備えた UI があります。このアクション シートには、アクション シートが閉じられたときに値を設定する日付ピッカーが含まれていますUILabel

- (IBAction)setPurchaseDateTapped {
    self.activeField = purchaseDate;
    [self loadDatePickerActionSheet:@"Edit Purchase Date"];
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    self.activeField.text = value_from_UIActionSheet;
}

ここでわかるように、actionSheet clickedButtonAtIndex コールバックでは を渡すことができないためactiveField、クラス変数を使用する必要があります。次のように書く方が正しいようです。

- (void)actionSheet:(UIActionSheet *)actionSheet parameterValue:(id)parameter {
    parameter.text = value_from_UIActionSheet;
}

UIActionSheet と UIActionSheet デリゲートをサブクラス化し、必要な署名を追加できると思いますが (?)、これも無駄な労力のように思えます。

だから私の質問は、私がやろうとしていることを行うための最良の方法は何ですか?

作成した日付ピッカー/アクション シート インターフェイスを必ずしも変更したいわけではありません (ただし、DatePicker を邪魔にならないようにしながら UIView に複数の日付を設定するためのより良いパターンがあれば、私はすべて耳にします。)

4

3 に答える 3

3

UIActionSheetこの場合、の単純なサブクラスが進むべき道だと思います。

@interface SpecialActionSheet : UIActionSheet
{
    id parameter;
}
@property (assign) id parameter;
@end

@implementation SpecialActionSheet
@synthesize parameter;
@end

actionSheetにパラメータを保持させるだけなので、これで十分です。これで、コードは次のようになります。

- (void)loadDatePickerActionSheet:(NSString *)caption forField:(UITextField *)field {
    //...
    datePickerActionSheet.parameter = field;
}

- (IBAction)setPurchaseDateTapped {
    [self loadDatePickerActionSheet:@"Edit Purchase Date" forField:purchaseDate];
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    UITextField * field = ((SpecialActionSheet *)actionSheet).parameter;
    field.text = value_from_UIActionSheet;
}
于 2010-01-25T17:28:02.150 に答える
2

このような状況での私の通常のアプローチは、UIAlertViewsのtagプロパティを使用し、それを切り替えることです(整数です)。文字列などを渡すほど良いものではありませんが、複数のアラートがある場合は、曖昧さを解消する簡単な方法です。例えば:

...
actionSheet.tag = [fields indexOfObject: self.activeField];
...        //fields is an NSArray of all the field objects I might have on the screen


- (void)actionSheet:(UIActionSheet *)actionSheet parameterValue:(id)parameter {
    [[field objectAtIndex: actionSheet.tag] setText: value_from_UIActionSheet];
}
于 2010-01-25T17:29:25.017 に答える
2

別の解決策は、連想記憶域を使用することです。

UIActionSheet には既にある場合があります。あなたはそれをテストすることができます

[myActionSheet setValue:@"test value" forKey:@"testKey];
NSLog(@"%@",[myActionSheet valueForKey:@"testKey];

連想記憶域は、使いすぎなければかなり便利です。

于 2010-01-25T18:53:35.707 に答える