Как создать UITableViewCell с UISwitch и получить данные? - PullRequest
32 голосов
/ 03 января 2011

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

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

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

Ответы [ 5 ]

85 голосов
/ 03 января 2011

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

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

Сообщите, хотите ли вы пример кода.

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

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

 }
8 голосов
/ 15 января 2013
Switch.tag = indexPath.row;
[Switch addTarget:self action:@selector(updateSwitchAtIndexPath:) forControlEvents:UIControlEventTouchUpInside];



- (void)updateSwitchAtIndexPath:(UISwitch *)aswitch{
    FFLog(@"%i",aswitch.tag);
}
4 голосов
/ 02 сентября 2011

Спасибо. У меня нет вашего 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");
            }

        }
    }
}

}

3 голосов
/ 03 января 2011

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

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

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

1 голос
/ 11 февраля 2017

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