Skip to content

Commit

Permalink
* When persisting controllers, allow them to say they are "important"…
Browse files Browse the repository at this point in the history
…, which means they must always be restored even if the persistence expiration date has passed. Crucial to avoid losing user-created content.
  • Loading branch information
joehewitt committed Aug 7, 2009
1 parent 6118081 commit f0e544c
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 1 deletion.
1 change: 1 addition & 0 deletions src/TTMessageController.m
Expand Up @@ -461,6 +461,7 @@ - (BOOL)persistView:(NSMutableDictionary*)state {

NSInteger firstResponder = [self fieldIndexOfFirstResponder];
[state setObject:[NSNumber numberWithInt:firstResponder] forKey:@"firstResponder"];
[state setObject:[NSNumber numberWithBool:YES] forKey:@"__important__"];
return [super persistView:state];
}

Expand Down
17 changes: 16 additions & 1 deletion src/TTNavigator.m
Expand Up @@ -509,13 +509,24 @@ - (void)persistViewControllers {
[self persistController:_rootViewController path:path];
TTLOG(@"DEBUG PERSIST %@", path);

// Check if any of the paths were "important", and therefore unable to expire
BOOL important = NO;
for (NSDictionary* state in path) {
if ([state objectForKey:@"__important__"]) {
important = YES;
break;
}
}

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
if (path.count) {
[defaults setObject:path forKey:@"TTNavigatorHistory"];
[defaults setObject:[NSDate date] forKey:@"TTNavigatorHistoryTime"];
[defaults setObject:[NSNumber numberWithInt:important] forKey:@"TTNavigatorHistoryImportant"];
} else {
[defaults removeObjectForKey:@"TTNavigatorHistory"];
[defaults removeObjectForKey:@"TTNavigatorHistoryTime"];
[defaults removeObjectForKey:@"TTNavigatorHistoryImportant"];
}
[defaults synchronize];
}
Expand All @@ -524,9 +535,12 @@ - (UIViewController*)restoreViewControllers {
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSDate* timestamp = [defaults objectForKey:@"TTNavigatorHistoryTime"];
NSArray* path = [defaults objectForKey:@"TTNavigatorHistory"];
BOOL important = [[defaults objectForKey:@"TTNavigatorHistoryImportant"] boolValue];
TTLOG(@"DEBUG RESTORE %@ FROM %@", path, [timestamp formatRelativeTime]);

if (_persistenceExpirationAge && -timestamp.timeIntervalSinceNow > _persistenceExpirationAge) {
BOOL expired = _persistenceExpirationAge
&& -timestamp.timeIntervalSinceNow > _persistenceExpirationAge;
if (expired && !important) {
return nil;
}

Expand Down Expand Up @@ -618,6 +632,7 @@ - (void)resetDefaults {
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:@"TTNavigatorHistory"];
[defaults removeObjectForKey:@"TTNavigatorHistoryTime"];
[defaults removeObjectForKey:@"TTNavigatorHistoryImportant"];
[defaults synchronize];
}

Expand Down
2 changes: 2 additions & 0 deletions src/TTPostController.m
Expand Up @@ -205,6 +205,8 @@ - (void)loadView {
// UIViewController (TTCategory)

- (BOOL)persistView:(NSMutableDictionary*)state {
[state setObject:[NSNumber numberWithBool:YES] forKey:@"__important__"];

NSString* delegate = [[TTNavigator navigator] pathForObject:_delegate];
if (delegate) {
[state setObject:delegate forKey:@"delegate"];
Expand Down

0 comments on commit f0e544c

Please sign in to comment.