Удалить или добавить UITableViewCell в соответствии с состоянием UISwitch - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть таблица с четырьмя рядами. Два из них должны отображаться изначально - строки 1 и 2. Другие два должны появляться только в том случае, если состояние UISwitch, расположенного в строке 2, установлено на «Вкл». Если для состояния установлено значение «Выкл.», Они должны исчезнуть.

Я создал UITableViewCell с удержанием UISwitch:

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

    NSDictionary *dictionary = [listOfItems objectAtIndex:indexPath.section];
    NSMutableArray *dict = [dictionary objectForKey:@"DATA"];

    //the location of the switch!

        if(indexPath.row == 1){

            SwitchCell *cell = (SwitchCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
            if (cell == nil) {

                NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SwitchCell" owner:self options:nil];
                cell = (SwitchCell *)[nib objectAtIndex:0];
            }

            cell.title1.text = [dict objectAtIndex:indexPath.row];

            [cell.switchSpecifyEnd addTarget:self action:@selector(switchSpecifyEnd) forControlEvents:UIControlEventValueChanged];
            mySwitch = cell.switchSpecifyEnd;

                return cell;
        }else{
        static NSString *CellIdentifier1 = @"CustonCell";

        DateTimeCell *cell = (DateTimeCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
        if (cell == nil) {

            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DateTimeCell" owner:self options:nil];
            cell = (DateTimeCell *)[nib objectAtIndex:0];
        }

        cell.description.text = [dict objectAtIndex:indexPath.row];
        cell.dateTime.text = self.date;

        return cell;
    }
}



-(void) switchSpecifyEnd{
    //displays only 0 (defined initial state of  my switch)
    NSLog(@"SWITCH - Specify End: %d",  mySwitch.state);


    //    [tableView1 deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    //    [tableView1 reloadData];
}

Как сделать так, чтобы строки 3 и 4 не отображались изначально, и позволить им появляться, если состояние переключателя изменено на "Вкл"?

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Вам необходимо установить переменную в вашем классе, которая будет указывать, включен или выключен переключатель.Используйте эту переменную в tableView: numberOfRowsInSection, чтобы определить, нужно ли возвращать 2 или 4 в качестве количества ячеек.

После того, как вы переключили переключатель в положение «Вкл.», Вам нужно изменить эту переменную и вызвать reloadData (выуже есть этот вызов в вашем действии переключателя, но он закомментирован).

Затем контроллер табличного представления снова вызовет tableView: numberOfRowsInSection и получит новое количество ячеек.Затем tableView: cellForRowAtIndexPath: будет вызван снова и снова запросит все ячейки, теперь включая номера 3 и 4.

1 голос
/ 23 ноября 2011

Я думаю, что наилучшей практикой для этого будет:

  • Переместить UISwitch из tableView, просто поместите его над таблицей
  • Используйте NSMutableArrayв качестве источника данных

Просто добавьте или удалите два элемента из массива источника данных или из него и после переключения переключателя вызовите [tableView reloadData].

Это означает, что вместо простогоtableViewCell невидим, вы скорее удаляете все данные за ним каждый раз, когда хотите скрыть их.Это может быть менее идеальным, поэтому вы также можете выбрать NSArray для хранения ваших данных.Вместо того, чтобы затем удалять / добавлять данные из / в него, у вас должна быть глобальная переменная BOOL, чтобы отслеживать, должны ли отображаться 2 ячейки.В ваших UITableViewDataSource методах оберните содержимое функций в предложение if.Например, для - (NSInteger)tableView:numberOfRowsInSection:

// assume we have a global BOOL showAllRows which is manipulated with the UISwitch
// assume the data for the UITableView is loaded from an NSArray * data
if (self.showAllRows)
    return self.data.count;
else
    return self.data.count - 2; 

Затем вы должны сделать то же самое в методе - (UITableViewCell*)tableView:cellForRowAtIndexPath: для настройки ваших ячеек.

Надеюсь, это поможет!

...