Как Вы удаляете переменные класса с одним разовым использованием из кода Objective C?

Я пишу некоторый код Objective C, и я часто поражал ситуацию, где я должен использовать переменную класса для хранения значения для одного использования времени. После потребления его мне больше не нужен он. Мне, храня это значение в переменной класса походит на запах кода. Действительно значение должно быть передано в в качестве параметра методам, которые я использую.

Я натыкаюсь на это обычно, когда я использую делегатов. Как пример, у меня есть UI с несколькими кнопками, используемыми, чтобы загрузить и отобразить a UIActionSheet когда они касаются. Этот лист действия содержит средство выбора даты, которое устанавливает значение для a 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 делегируют и добавляют подписи, которых я требую, но снова это походит на большее усилие, чем это стоит.

Таким образом, мой вопрос - то, что лучший способ состоит в том, чтобы сделать то, что я пытаюсь сделать?

Я не обязательно хочу изменить интерфейс листа средства выбора/действия даты, который я создал (хотя, если существует лучший шаблон для того, чтобы назначить несколько дат на UIView при хранении DatePicker от пути, я внимательно слушаю.)

6
задан Gavin Miller 25 January 2010 в 17:10
поделиться

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;
}
3
ответ дан 17 December 2019 в 00:09
поделиться

Электронная таблица :: Parseexcel Модуль может прочитать файлы Excel. Документация включает примеры, как его использовать.

-121--3774688-

Другое решение состоит в использование ассоциативного хранения.

UiabactionShet может уже иметь его. Вы можете проверить его с помощью ассоциативного хранилища

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

довольно нефте, если не изменилось.

2
ответ дан 17 December 2019 в 00:09
поделиться

Мой обычный подход в этих ситуациях состоит в том, чтобы использовать свойство тега на UialTViews и выключите его (это целое число). Это не так приятно, как наличие строки или что-то, чтобы пройти вниз, но если у вас есть несколько предупреждений, это простой способ устранить неоднозначность. Например:

...
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];
}
2
ответ дан 17 December 2019 в 00:09
поделиться