Как создать UITableViewCell с UISwitch и получить данные?

У меня есть простая проблема. Я создал пользовательский UITableViewCell, который включает UISwitch в Interface Builder.

Вопрос 1: проще, лучше способ сделать это ? Вопрос 2: при использовании в UITableViewController, каков был бы лучший способ получить данные ? В какой-то момент мне нужно либо пройти через таблицу и проверить каждую ячейку о состоянии, либо отправить некоторую обратную связь, когда состояние коммутаторов изменяется напрямую ?

Спасибо за помощь.

5 ответов


вы можете просто добавить UISwitch в вашем представлении аксессуаров. Это самый простой способ сделать это, не говоря уже о том, что он выглядит "элегантно".

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

дайте знать, если вы хотите пример кода.

---пример кода---

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    //add a switch
    UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero];
    cell.accessoryView = switchview;
    [switchview release];
}

cell.textLabel.text = [NSString stringWithFormat:@"%d", indexPath.row];

return cell;
}

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

пример:

- (void)updateSwitchAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
UISwitch *switchView = (UISwitch *)cell.accessoryView;

if ([switchView isOn]) {
    [switchView setOn:NO animated:YES];
} else {
    [switchView setOn:YES animated:YES];
}

 }

Switch.tag = indexPath.row;
[Switch addTarget:self action:@selector(updateSwitchAtIndexPath:) forControlEvents:UIControlEventTouchUpInside];



- (void)updateSwitchAtIndexPath:(UISwitch *)aswitch{
    FFLog(@"%i",aswitch.tag);
}

спасибо. У меня нет вашего indexPath, но вы можете идентифицировать ячейку или объект с тегом вроде этого:

if (indexPath.row == 0) {
        cell.textLabel.text = @"Twitter";


        UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero];
        switchview.tag = 111;
        //switchview.selected = 0;
        cell.accessoryView = switchview;

        [switchview addTarget:self action:@selector(updateSwitchAtIndexPath) forControlEvents:UIControlEventTouchUpInside];

        //cell.accessoryType =UITableViewCellAccessoryDisclosureIndicator;
        //[switchview release];

    }


- (void)updateSwitchAtIndexPath {

for (UITableViewCell * cell in tblView.subviews) {

   for (UISwitch *swch in cell.subviews) {


         UISwitch *switchView = (UISwitch *)cell.accessoryView;

        if (switchView.tag == 111) {

            if ([switchView isOn]) {
                 NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ON");
            }else{
                NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> OFF");
            }

        } 

          if (switchView.tag == 222) {
            if ([switchView isOn]) {
                NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ON");
            }else{
                NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> OFF");
            }

        }
    }
}

}


два варианта:

1) инициализируйте свою ячейку указателем на модель данных. Попросите ячейку реализовать обратный вызов делегата для коммутатора. При изменении переключателя, используйте указатель на модель данных, чтобы отразить новое значение. Кроме того, инициализируйте ячейку указателем на контроллер представления. Попросите ячейку реализовать метод делегата switch, затем перезвоните в контроллер представления с соответствующей информацией о контексте ячейки.

2) Ваш view-controller реализует обратный вызов делегата коммутатора. Когда коммутатор изменяется, определите, какой коммутатор / ячейка он был (возможно, придется установить свойство "tag" коммутатора как номер строки или что-то еще) и обработайте обновление в контексте вашего контроллера представления.


чтобы получить значение UISwitch в Swift 3 и Swift 4 Вы можете добавить к нему цель:

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell {

    ...

    cell.uiSwitch.tag = 100
    cell.uiSwitch.addTarget(self, action: #selector(ViewController.switchAtValueChanged(switchFromTableViewCell:)), for: UIControlEvents.valueChanged)

    ...
}

и вы можете получить значение, как это:

@objc func switchAtValueChanged(uiSwitch: UISwitch) {

    if uiSwitch.tag == 100 {
        let value = uiSwitch.isOn
    }
}