2012-11-28 10 views
8

私は、iOS 6でUIKit状態の保存を使用するアプリケーションを持っています。ビューコントローラの状態を保存/復元することができます。それを復元するために私のテーブルビューを取得することはできません。UIKit状態保存スクロールオフセットを復元しない

- (NSString *)modelIdentifierForElementAtIndexPath:(NSIndexPath *)indexPath inView:(UIView *)view 
{ 
    TSStatus *status = [self._fetchedResultsController objectAtIndexPath:indexPath]; 

    return status.objectID.URIRepresentation.absoluteString; 
} 

- (NSIndexPath *)indexPathForElementWithModelIdentifier:(NSString *)identifier inView:(UIView *)view 
{ 
    NSURL *statusURL = [NSURL URLWithString:identifier]; 
    NSManagedObjectID *statusID = [[TSDataController sharedController].persistentStoreCoordinator managedObjectIDForURIRepresentation:statusURL]; 
    TSStatus *status = (TSStatus *)[[TSDataController sharedController].mainContext objectWithID:statusID]; 

    return [__fetchedResultsController indexPathForObject:status]; 
} 

modelIdentifierForElementAtIndexPath:inView:は、アプリがバックグラウンドに移行したときに呼び出さなっている次のように私は、ビューのための私のストーリーボードで復元識別子だけでなく、ビューコントローラとビューコントローラ(テーブルのデータ・ソース)UIDataSourceModelAssociationを実装していしかし、modelIdentifierForElementAtIndexPath:inView:は決して呼び出されません。

+1

あなたの最後の段落が誤植であると思いますか? --- "modelIdentifierForElementAtIndexPath:inView:アプリケーションがバックグラウンドになると呼び出されますが、modelIdentifierForElementAtIndexPath:inView:never gets called" – Daniel

答えて

2

これはあなたの質問に対する真の答えではありませんが、私はtable viewを取得してもcontentOffsetを復元できませんでした。

I 1)は、ビューが属するrestorationIdentifier 2)ビュー・コントローラを有する場合ドキュメントは明らかに、UITableViewがcontentOffset復元することを述べているので、これは、IOSの6のバグであり推測restorationIdentifier 3)データを有していますソースはUIDataSourceModelAssociationプロトコルに準拠しています。

あなたはしかし、あなたのビューコントローラに手動でcontentOffsetと、選択したアイテムを復元することができます。

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder 
{ 
    [super encodeRestorableStateWithCoder:coder]; 

    [coder encodeObject:[NSValue valueWithCGPoint:self.tableView.contentOffset] forKey:@"tableView.contentOffset"]; 

    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
    if (indexPath != nil) { 
     NSString *modelIdentifier = [self modelIdentifierForElementAtIndexPath:indexPath inView:self.tableView]; 
     [coder encodeObject:modelIdentifier forKey:@"tableView.selectedModelIdentifier"]; 
    } 
} 

- (void)decodeRestorableStateWithCoder:(NSCoder *)coder 
{ 
    [super decodeRestorableStateWithCoder:coder]; 

    CGPoint contentOffset = [[coder decodeObjectForKey:@"tableView.contentOffset"] CGPointValue]; 
    self.tableView.contentOffset = contentOffset; 

    NSString *modelIdentifier = [coder decodeObjectForKey:@"tableView.selectedModelIdentifier"]; 
    if (modelIdentifier != nil) { 
     NSIndexPath *indexPath = [self indexPathForElementWithModelIdentifier:modelIdentifier inView:self.tableView]; 
     if (indexPath != nil) { 
      [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; 
     } 
    } 
} 

を私はUITableViewは、ドキュメントはそれがないと言うにもかかわらず、自動的にそれをしない理由はわかりません。誰かが答えを知っているなら、コメントしてください。

3

UITableView でもにrestorationIdentifierが設定されていると、これが機能することがわかりました。

ただし、UITableViewControllerがUINavigationController内にある場合は機能しません。 Appleに問題が報告されました:問題ID:13536778。この問題は、iOS 6.0と6.1.3の両方で発生しているようです。

+0

navigationControllerのテーブル:まだiOS9のバグのように見える – Jaro

2

これは、あなたのテーブルビューは、あなたがそうのよう-indexPathForElementWithModelIdentifier:inView:で有効なインデックスのパスを返す前に、あなたのテーブルビューに-reloadDataを呼び出す必要がありUIDataSourceModelAssociationプロトコルを使用して作業するための状態の復元を取得するにはiOSの6

のバグです:

- (NSIndexPath *)indexPathForElementWithModelIdentifier:(NSString *)identifier inView:(UIView *)view 
{ 
    NSURL *statusURL = [NSURL URLWithString:identifier]; 
    NSManagedObjectID *statusID = [[TSDataController sharedController].persistentStoreCoordinator managedObjectIDForURIRepresentation:statusURL]; 
    TSStatus *status = (TSStatus *)[[TSDataController sharedController].mainContext objectWithID:statusID]; 

    [self.tableView reloadData]; 

    return [__fetchedResultsController indexPathForObject:status]; 
} 
+0

この1つはありがとう! –

+0

このバグはiOS 7で修正されているようです。reloadDataを呼び出して、テーブルビューの状態を復元する必要はなくなりました。 – bilobatum

関連する問題