Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Вы можете просто добавить 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;
}

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

Пример:

- (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];
}

 }

Ответ 2

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



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

Ответ 3

Два варианта:

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

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

Ответ 4

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

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");
            }

        }
    }
}

}

Ответ 5

Чтобы получить значение 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
    }
}