addTarget: action: forControlEvents - UISwitch в TableView - отправитель в порядке, событие всегда 0x0 - PullRequest
3 голосов
/ 03 мая 2011

Используя фантастические посты на этом форуме, я создал переключатель в виде accessoryView в tableView. При касании переключателя вызывается мое действие (switchChanged). Только отправитель имеет допустимое значение, событие 0x0.

Добавление цели в switchView:

        [switchView addTarget:self action:@selector(switchChanged:forEvent:) forControlEvents:(UIControlEventValueChanged | UIControlEventTouchDragInside)];

Акция:

- (void) switchChanged:(id)sender forEvent:(UIEvent *)event {
  if(event) {
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:[[[event touchesForView:sender] anyObject] locationInView:self.tableView]];
    IFDFlightlogFormQuestions *question = [self.resultsController objectAtIndexPath:indexPath];
    NSLog(@"IFDNewFlightlogViewController_Pad:switchChanged Switch is %@ xmlAttrib %@",[sender isOn],question.XmlAttrib);
    [self.xmlResults setValue:([sender isOn])?@"true":@"false" forKey:question.XmlAttrib];
  }
}

Использование action:@selector(switchChanged: forEvent:) - Добавлен пробел - без изменений.

Использование action:@selector(switchChanged::) - удалено forEvent - нераспознанный селектор.

Моя цель - получить indexPath для tableView, чтобы я мог изменить значение в своем словаре.

В настоящее время я могу использовать только информацию об отправителе, но мне нужна информация о событии:

- (void) switchChanged:(id)sender forEvent:(UIEvent *)event {
    UISwitch *switchView = (UISwitch *)sender;
    UITableViewCell *cell = (UITableViewCell *)switchView.superview;
    UITableView *tableView = (UITableView *)cell.superview;
    NSIndexPath *indexPath = [tableView indexPathForCell:cell];
    IFDFlightlogFormQuestions *question = [self.resultsController objectAtIndexPath:indexPath];
    NSLog(@"IFDNewFlightlogViewController_Pad:switchChanged Switch is %@ xmlAttrib %@",([sender isOn])?@"On":@"Off",question.XmlAttrib);
    [self.xmlResults setValue:([sender isOn])?@"true":@"false" forKey:question.XmlAttrib];        
}

Есть ли какие-нибудь указатели на получение информации о событии по этому поводу?

Ответы [ 3 ]

5 голосов
/ 21 декабря 2013

Можно вызвать @selector, добавив цель к UISwitch.

[switchCtl addTarget:self action:@selector(action:) forControlEvents:UIControlEventValueChanged];
2 голосов
/ 02 июня 2011

Другая возможность - установить свойство тега на UISwitch так, чтобы оно соответствовало строке вашего табличного представления.Если вы также используете несколько разделов, то вы можете придумать какое-то решение для их кодирования в одно целочисленное значение.Помните, что при таком подходе вам нужно обновлять тег каждый раз, когда вы обновляете ячейку (tableView: cellForRowAtIndexPath :), поскольку строка может изменяться при повторном использовании ячеек.

0 голосов
/ 03 мая 2011

К сожалению, не forEvent: отправляется из действия UIControl ... только первая часть, поэтому вы не видите никакого значения.

То, как работает ваш обходной путь, является подходящим методом.

Другим способом было бы создать подкласс UISwitch, чтобы он содержал ссылку на NSIndexPath или даже переопределял

- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event

для прерывания и отправки пользовательского события ...

...