2009-09-26 1 views
19

私は自分のテーブルビューに最後の位置を記憶させようとしているので、アプリを再実行した後にその位置にスクロールします。これを行うには、私のviewWillDisappear:メソッドでは、私は最初の可視行番号を取得し、NSUserDefaultsに保存します。私のviewDidAppearでテーブルビューにscrollToRowAtIndexPathを送信してその行にスクロールしようとします。しかし、私はNSRangeExceptionを得る:UITableView scrollToRowAtIndexPath

*** Terminating app due to uncaught exception 'NSRangeException', reason: '-[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]: section (0) beyond bounds (0).

任意のヘルプ高く評価しました。ここでは、コードは次のようになります。

- (void)viewDidAppear:(BOOL)animated 
{ 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 

    if ([userDefaults valueForKey:@"content_row"] != nil) 
    { 
     int rowToHighlight = [[userDefaults valueForKey:@"content_row"] intValue]; 
     NSIndexPath * ndxPath= [NSIndexPath indexPathForRow:rowToHighlight inSection:0]; 
     [contentTableView scrollToRowAtIndexPath:ndxPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
    } 
} 

-(void) viewWillDisappear:(BOOL)animated 
{ 
    NSIndexPath *selectedRowPath = [[contentTableView indexPathsForVisibleRows] objectAtIndex:0]; 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    [userDefaults setInteger:selectedRowPath.row forKey:@"content_row"]; 
} 
+0

scrollToRowAtIndexPathとNSIndexPathの作成を行うコードのビットを投稿できますか? – probablyCorey

答えて

52

scrollToRowAtIndexPathを呼び出す前にTableViewデータを再ロードします。

[contentTableView reloadData]; 
+4

データがまだロードされていない場合(フェッチされた結果コントローラを使用して)、これは私のためには機能しません。私の解決策は 'tableView.numberOfRowsInSection(0)> 0'を最初にチェックすることでした。 – SimplGy

+0

または別のスレッドで試してみてください。 '[tblView performSelectorOnMainThread:@セレクタ(reloadData)withObject:nil waitUntilDone:YES]' – matrixugly

8

それはcontentTableViewは、まだデータのロードが完了していない可能性があります。

+1

完了したら通知を受け取るにはどうすればよいですか? –

+2

申し訳ありませんが、scrollToRowAtIndexPathがviewDidLoadで呼び出されていると思いました。 viewDidAppearで同様の呼び出しがありますが、保存された行番号に戻る代わりに、didSelectRowAtIndexPathに保存されている保存されたキー値に戻ります。 scrollToRowAtIndexPathを呼び出す前に、現在ロードされているデータソースのキー値の行が見つかりました。 – DyingCactus

+0

甘い!これは実際に私の歯車が正しい方向に回転するのを助けました。私は別の答えで精緻化した。 – matrixugly

0

私はDyingCactusの答えを詳述したいと思います。私はかなり新しいiOSの開発者だと私の状況は少し異なっていたが、彼は

を言ったように「それはcontentTableViewはまだ データのロードが完了していない可能性があります」

答えながら簡単に、それは私の車輪を回転させて、それはまさに私のために起こっていたものでした。 ""

  • マイアプリはボタンがクリックされたViewControllerを "B" に新しいViewControllerを "B"
  • を提示

    マイセットアップ

    • のUITableViewはのViewController上で、そのデータが追加されますUITableViewのデータソースに追加します。 Bのボタンのクリックハンドラから
    • [tableView reloadData][tableView selectRowAtIndexPath:idxPath animated:false scrollPosition:UITableViewScrollPositionTop];
    • のViewController "B" と呼ばれ、Bのボタンのクリックハンドラから
    • と呼ばれ却下され、 "A" は(更新のUITableViewを示す)を再度提示され
    私は修正しなければならなかった最初の問題はを呼び出すことだった

    • ソリューションメインスレッドのはそうです

      [tblView performSelectorOnMainThread:@selector(reloadData)withObject:nil waitUntilDone:false];

    • waitUntilDoneに変更しました。(DUH!)ので、明らかに私のために、contentTableViewは、メインスレッド上で実行されている私のreloadDataコールを明示的に選択が行われるまでブロックするように設定されていなかったため、データをロードして行われていなかった

    うん、。

    これは誰かを助けることを望みます。

  • 関連する問題