web-dev-qa-db-ja.com

UITableViewでデフォルトでリロードした後、選択した行を覚えて維持する方法は?

デフォルトで選択されている行を設定するにはどうすればよいですか?行を選択し、選択した行の番号をindexpath.rowそして、テーブルをリロードして、選択された行を選択します。誰かが私を助けてくれますか?メソッド-(IBActionsegmentedControlIndexChangedで選択した行を取得できますか? 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;
    }
}
29
user567
NSIndexPath *indexPath = [tableView indexPathForSelectedRow];

現在選択されている行のNSIndexPathを提供します。その後、できます

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

後でその行を選択します(そして画面の中央に表示します)。

64
Seamus Campbell

私は同じ質問をしました、そして、これは私がそれをした方法です:

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

    }

}
30
xlsmearlx

これはそれを行います:

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

ここで、は選択するセル番号(0 ...から始まります)、セクションはセルが表示されるセクションです。

9
Nuno Costa

これは、UITableViewで行を事前選択する方法です。

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

IndexPathを選択する行に設定し、上記のようにメソッドを呼び出します。

5
mahboudz

私はこの質問がかなり古い(2011年)ことを認識していますが、(私のような)誰かがこの問題を検索してこの質問に出くわした場合に備えて、最新の回答も投稿するためです。

IOS 9では、AppleはUITableViewを大幅に改善しました。テーブルがリロードされてもフォーカスが失われないようにするには、次のようにします。

tableView.remembersLastFocusedIndexPath = Yes;

そして、それは「魔法のように動作します」。

さらに良いことに、実装する

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

UITableViewDelegateで、最初に画面に描画されたときに選択したい行をテーブルに知らせる。

IOS 9以前は、通常、自分でreloadDataメソッドを記述するだけでした。このメソッドは、現在選択されている行を取得し、テーブルをリロードしてから再度選択します。 UITableViewControllerで、またはreloadDataを直接呼び出すコードを防ぐことができなかったテーブルで作業する必要がある場合、UITableViewをサブクラス化し、reloadDataをオーバーライドしました(ちょっと、委任推奨される方法ですが、iOSでもサブクラス化してオーバーライドする必要がある場合があります)。

4
Mecki

次のコードを使用して、テーブルビューで選択した行を取得します。 :)

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には、選択したセルの行番号が含まれます。

0
karthikc217