2012-11-28 25 views
8

Tôi có một ứng dụng đang sử dụng tính năng bảo toàn trạng thái UIKit trong iOS 6. Tôi có thể lưu/khôi phục trạng thái của bộ điều khiển chế độ xem, tức là tab nào được chọn và phân cấp điều khiển điều hướng. không thể có được cái nhìn bảng của tôi để khôi phục lại sự bù đắp của nó. Tôi có một nhận dạng phục hồi trong kịch bản của tôi cho quan điểm cũng như bộ điều khiển xem và điều khiển view (nguồn dữ liệu của bảng) thực hiện UIDataSourceModelAssociation như sau:Bảo vệ trạng thái UIKit không khôi phục độ lệch cuộn

- (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: là nhận được gọi khi ứng dụng đi vào nền tuy nhiên, modelIdentifierForElementAtIndexPath:inView: không bao giờ được gọi.

+1

Tôi cho rằng đoạn đóng của bạn là lỗi đánh máy? --- "modelIdentifierForElementAtIndexPath: inView: được gọi khi ứng dụng chuyển sang nền, tuy nhiên modelIdentifierForElementAtIndexPath: inView: không bao giờ được gọi." – Daniel

Trả lời

2

Đây không phải là câu trả lời thực sự cho câu hỏi của bạn, nhưng tôi cũng không thể có được một cái nhìn bảng khôi phục lại contentOffset của nó.

Tôi đoán đây là lỗi trong iOS 6, vì tài liệu nêu rõ rằng UITableView khôi phục contentOffset của nó, khi 1) có restorationIdentifier 2) bộ điều khiển chế độ xem có dữ liệu restorationIdentifier và 3) nguồn tuân theo giao thức UIDataSourceModelAssociation.

Bạn có thể khôi phục lại contentOffset và mục đã chọn bằng tay trong điều khiển điểm của bạn, mặc dù:

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

Tôi không có ý tưởng tại sao UITableView không làm điều đó tự động, mặc dù các tài liệu nói nó. Nếu ai đó biết câu trả lời, hãy bình luận.

3

Tôi đã tìm thấy tính năng này có thể hoạt động, nếu UITableView cũng có bộ khôi phục.

Tuy nhiên, nó không hoạt động nếu UITableViewController nằm trong UINavigationController. Điều này đã được báo cáo cho Apple, ID sự cố: 13536778. Sự cố này dường như xảy ra trên cả iOS 6.0 và 6.1.3.

+0

bảng trong điều hướngController: trông giống như một lỗi trong iOS9 quá – Jaro

2

Đây là một lỗi trong iOS 6.

Để có được phục hồi trạng thái cho xem bảng của bạn làm việc bằng cách sử dụng giao thức UIDataSourceModelAssociation bạn nên gọi -reloadData trên xem bảng của bạn trước khi trở về con đường chỉ có giá trị trong -indexPathForElementWithModelIdentifier:inView: như vậy:

- (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

cảm ơn cho điều này! –

+0

Lỗi này dường như được sửa với iOS 7. Tôi không còn cần phải gọi lại reloadData để khôi phục trạng thái cho chế độ xem bảng. – bilobatum