如何从Objective-C代码中删除一次性使用的类变量?

Gav*_*ler 6 iphone delegates objective-c uiactionsheet

我正在编写一些Objective-C代码,而且我经常遇到必须使用类变量来存储一次使用值的情况.消费后我不再需要它了.对我来说,将这个值存储在类变量中似乎是代码味道.确实应该将值作为参数传递给我正在使用的方法.

当我正在消费代表时,我经常遇到这种情况.作为一个例子,我有一个带有多个按钮的UI,用于加载和显示UIActionSheet它们被点击的时间.此操作表包含一个日期选择器,用于设置UILabel解除操作表单时的值.

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

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

正如你在这里看到的那样,actionSheet clickedButtonAtIndex回调不允许我传递,activeField所以我必须使用类变量.写这个似乎更正确:

- (void)actionSheet:(UIActionSheet *)actionSheet parameterValue:(id)parameter {
    parameter.text = value_from_UIActionSheet;
}
Run Code Online (Sandbox Code Playgroud)

我相信(?)我可以继承UIActionSheet和U​​IActionSheet委托,并添加我需要的签名,但这似乎更值得付出努力.

所以我的问题是,做我想做的事情的最佳方法是什么?

我不一定想要更改我创建的日期选择器/操作表界面(尽管如果有一个更好的模式可以在UIView上设置多个日期同时保持DatePicker不碍事,我会全力以赴.)

e.J*_*mes 3

在这种情况下,我认为一个简单的子类UIActionSheet将是可行的方法:

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

@implementation SpecialActionSheet
@synthesize parameter;
@end
Run Code Online (Sandbox Code Playgroud)

这应该足够了,因为您要做的就是让 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;
}
Run Code Online (Sandbox Code Playgroud)