Один IBAction для нескольких пользовательских ячеек прототипа с кнопками

Используя раскадровку, у меня есть контроллер табличного представления, содержащий несколько ячеек динамического прототипа. Одна из ячеек представляет собой пользовательскую динамическую ячейку-прототип (для которой я создал подкласс), содержащую метку и переключатель. У меня есть действие для переключателя, связанное с методом действия (скажем, switchChanged:) в контроллере представления. В cellForRowAtIndexPath я настраиваю и возвращаю ячейку, соответствующую указанному индексу. Все идет нормально.

Проблема: в моем приложении есть несколько экземпляров этих настраиваемых ячеек, так как мне отличить, какой переключатель изменился? Одна мысль состоит в том, что в контроллере представления я могу создать переключатель-член для каждой ячейки и связать их с конкретным переключателем ячейки, когда cellForRowAtIndexPath вызывается в первый раз. Затем я могу использовать эти переключатели-члены для сравнения с переключателем, переданным в switchChanged:.

Я знаю, что могу попробовать и получить немедленный ответ, но я надеялся на обсуждение того, как другие разработчики делают то, что я пытаюсь сделать. Является ли это лучшим/худшим/хорошим подходом и каковы практические альтернативы?

С уважением,

--Джон


person johnnyspo    schedule 13.06.2012    source источник


Ответы (2)


У меня была такая ситуация однажды (не с переключателями, но я думаю, что это применимо точно так же). Мне удалось обойти это, создав подкласс класса объекта и добавив необходимые свойства/методы внутри подкласса.

При вызове действия вашим отправителем будет подкласс, и вы сможете получить там доступ к своему добавленному коду.

Я не знаю, так ли это, но если вы только пытаетесь изменить значение, вы должны использовать привязку значения переключателя к свойству при создании объекта. Для вызова даже не потребуется IBAction.

РЕДАКТИРОВАТЬ: Пример:

@interface MySwitch : UISwitch
@property (nonatomic, assign) NSUInteger someProperty;
@end

Затем каждый раз, когда вы создаете ячейку, вы можете установить «someProperty» на все, что захотите.

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
  // yada yada yada...
  UITableViewCell *cell;
  // yada yada yada...

  [cell.myLinkedSwitch  setSomeProperty:indexPath.row];
  return(cell);
}

Если вы не создаете свои ячейки с помощью метода tableView:cellForRowAtIndexPath:. Тогда вам, вероятно, следует использовать привязки, чтобы получить значение в нужном месте.

person Sergio Moura    schedule 13.06.2012
comment
Я понимаю, что вы говорите, похоже, это относится только к одному экземпляру пользовательской ячейки. Но как я могу различать переключатели нескольких экземпляров ячеек? - person johnnyspo; 13.06.2012
comment
Итак, давайте посмотрим, понимаю ли я. Я могу добавить свойство, скажем, instanceID, в подкласс. Затем я могу установить это свойство для каждой ячейки сначала через cellForRowAtIndexPath. Затем, когда вызывается switchChanged:, я могу использовать instanceID, чтобы определить, какой переключатель изменил свое состояние. Кажется правильным? - person johnnyspo; 13.06.2012
comment
Почти! Вы будете устанавливать свойство для каждой ячейки каждый раз, когда вызывается cellForRowAtIndexPath. Если у вас 30 ячеек, эта функция будет вызываться 30 раз. - person Sergio Moura; 14.06.2012
comment
Спасибо за помощь Серджио! Работает как шарм! - person johnnyspo; 14.06.2012

Вместо добавления отдельного подкласса я просто сохранил строку в свойстве Disabled Title каждой кнопки. Это получалось очень легко. Этот первый код находится в CellForRowAtIndexPath:

NSString *strRow = [[NSString alloc] initWithFormat:@"%i",useRow];
[btnPreferredChk setTitle:strRow forState:UIControlStateDisabled];

Затем мой метод действия для кнопки использует это значение для выполнения соответствующего действия.

- (IBAction)goStorePick:(id)sender
{
  UIButton *useButton = [[UIButton alloc] init];
  useButton = sender;
  NSInteger *storeRow = [[useButton titleForState:UIControlStateDisabled] integerValue];

  NSString *CMIMsg = [[NSString alloc] initWithFormat:@"goStorePick Method Executed at Row: %i", storeRow];

  [self shwMessage:CMIMsg];
}

Это хорошо сработало для меня.

person user589642    schedule 04.03.2013