Как запомнить выбранные строки и сохранить их после перезагрузки по умолчанию в UITableView? - PullRequest
29 голосов
/ 25 мая 2011

Как установить строку, выбранную по умолчанию?Я хочу выбрать строку, взять номер выбранной строки с помощью indexpath.row, а затем перезагрузить таблицу и выбрать строку, которая была выбрана.Может кто-то помочь мне, пожалуйста?Могу ли я получить выбранную строку в методе - (IBAction) segmentedControlIndexChanged?Не в didSelectRowAtIndexPath?

Это мой код, если он поможет вам понять

- (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];
    }
    //lbl1 = [[UILabel alloc]initWithFrame:CGRectMake(200, 10, 100, 20) ];

    // Configure the cell...
    NSString *depdateChoosed=[deparatureDates objectAtIndex:depSelectedIndice];
    NSString *comeateChoosed=[deparatureDates objectAtIndex:comSelectedIndice];
    NSString *choosedDate =[NSString stringWithFormat:@"%@%@",depdateChoosed, comeateChoosed];
    NSLog(@"date choisi %@ ",choosedDate);

    if(segment.selectedSegmentIndex==0)
    {
        cell.textLabel.text =[deparatureDates objectAtIndex:indexPath.row];        
    }
    else if(segment.selectedSegmentIndex==1) {
         //cell.textLabel.text =[goingBackDates objectAtIndex:indexPath.row];
        //cell.textLabel.text=[goingBackDates objectAtIndex:indexPath.row];
        cell.textLabel.text =[goingBackDates objectAtIndex:indexPath.row];
    }
    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@" champ séléctionner : %d ",indexPath.row);

    if(segment.selectedSegmentIndex==0)
    {
        depSelectedIndice=indexPath.row;  
    }
    else if(segment.selectedSegmentIndex==1) {
        comSelectedIndice=indexPath.row;
    }
    //[tableView reloadData];
}

-(IBAction) segmentedControlIndexChanged
{
    int i;
    switch (self.segment.selectedSegmentIndex) 
    {
        case 0:
            i=0;

            [tableView reloadData];
            break;
        case 1:
            i=1;
            NSLog(@"dexieme segment selectionner");
            [tableView reloadData];
        default:
            break;
    }
}

Ответы [ 6 ]

64 голосов
/ 25 мая 2011
NSIndexPath *indexPath = [tableView indexPathForSelectedRow];

даст вам NSIndexPath для текущей выбранной строки.Затем вы можете сделать

[tableView selectRowAtIndexPath:indexPath 
                       animated:NO 
                 scrollPosition:UITableViewScrollPositionMiddle];

, чтобы выбрать эту строку (и показать ее в середине экрана) позже.

30 голосов
/ 14 августа 2012

У меня был тот же вопрос, и вот как я это сделал:

В вашем tableViewController, добавьте это в эту функцию

(UITableViewCell *)tableView: (UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{    
    if(indexPath.row == 'the row you want to select')
    {
        [tableView 
            selectRowAtIndexPath:indexPath 
            animated:TRUE 
            scrollPosition:UITableViewScrollPositionNone
        ];

        [[tableView delegate] 
            tableView:tableView 
            didSelectRowAtIndexPath:indexPath
        ];

    }

}
9 голосов
/ 12 января 2012

Это сделает это:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
[tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition: UITableViewScrollPositionNone];

Где строка - это номер ячейки, который вы хотите выбрать (начинается с 0 ...), а section - это раздел, где появляется ячейка.

5 голосов
/ 25 мая 2011

Вот как вы предварительно выбираете строку в UITableView:

[tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition: UITableViewScrollPositionNone];

Установите indexPath в качестве строки, которую вы хотите выбрать, а затем выполните вызов метода, как указано выше.

4 голосов
/ 25 ноября 2015

Я понимаю, что этот вопрос довольно старый (2011 г.), но просто для того, чтобы опубликовать актуальный ответ на тот случай, если кто-то (например, я) ищет эту проблему и наткнется на этот вопрос:

С iOS 9 Apple значительно улучшила UITableView.Чтобы убедиться, что фокус не будет потерян при перезагрузке таблицы, просто сделайте это:

tableView.remembersLastFocusedIndexPath = Yes;

, и он будет «магически работать».

Еще лучше, внедрите

- (NSIndexPath *)indexPathForPreferredFocusedViewInTableView:(UITableView *)tableView

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

До iOS 9 я обычно просто писал свой собственный метод reloadData, который получает выбранную в данный момент строку, перезагружает таблицу и затем выбирает ее снова.Либо в UITableViewController, либо, если мне нужно это для работы с таблицей, где я не могу предотвратить прямой вызов кода reloadData, я вложил в класс UITableView и переопределил reloadData (эй, делегирование - предпочтительный способ, но иногдаприходится создавать подклассы и переопределять даже в iOS).

0 голосов
/ 19 апреля 2016

Используйте следующий код, чтобы получить выбранные строки в табличном представлении. :)

NSArray *selectedRows=[tableView indexPathsForSelectedRows];
        NSMutableArray *rownumberArray=[[NSMutableArray alloc]init];
        for (int i=0; i<selectedRows.count; i++) {
            NSIndexPath *indexPath = [selectedRows objectAtIndex:i];
            NSInteger row = indexPath.row;
            NSNumber *number = [NSNumber numberWithInteger:row];
            [rownumberArray addObject:number];
        }

// rownumberArray содержит номера строк выбранных ячеек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...