// // IASKSpecifierValuesViewController.m // http://www.inappsettingskit.com // // Copyright (c) 2009: // Luc Vandal, Edovia Inc., http://www.edovia.com // Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com // All rights reserved. // // It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, // as the original authors of this code. You can give credit in a blog post, a tweet or on // a info page of your app. Also, the original authors appreciate letting them know if you use this code. // // This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php // #import "IASKSpecifierValuesViewController.h" #import "IASKSpecifier.h" #import "IASKSettingsReader.h" #import "IASKSettingsStoreUserDefaults.h" #define kCellValue @"kCellValue" @interface IASKSpecifierValuesViewController() - (void)userDefaultsDidChange; @end @implementation IASKSpecifierValuesViewController @synthesize tableView=_tableView; @synthesize currentSpecifier=_currentSpecifier; @synthesize checkedItem=_checkedItem; @synthesize settingsReader = _settingsReader; @synthesize settingsStore = _settingsStore; - (void) updateCheckedItem { NSInteger index; // Find the currently checked item if([self.settingsStore objectForKey:[_currentSpecifier key]]) { index = [[_currentSpecifier multipleValues] indexOfObject:[self.settingsStore objectForKey:[_currentSpecifier key]]]; } else { index = [[_currentSpecifier multipleValues] indexOfObject:[_currentSpecifier defaultValue]]; } [self setCheckedItem:[NSIndexPath indexPathForRow:index inSection:0]]; } - (id)settingsStore { if(_settingsStore == nil) { _settingsStore = [[IASKSettingsStoreUserDefaults alloc] init]; } return _settingsStore; } - (void)loadView { _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped]; _tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; _tableView.delegate = self; _tableView.dataSource = self; self.view = _tableView; } - (void)viewWillAppear:(BOOL)animated { if (_currentSpecifier) { [self setTitle:[_currentSpecifier title]]; [self updateCheckedItem]; } if (_tableView) { [_tableView reloadData]; // Make sure the currently checked item is visible [_tableView scrollToRowAtIndexPath:[self checkedItem] atScrollPosition:UITableViewScrollPositionMiddle animated:NO]; } [super viewWillAppear:animated]; } - (void)viewDidAppear:(BOOL)animated { [_tableView flashScrollIndicators]; [super viewDidAppear:animated]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userDefaultsDidChange) name:NSUserDefaultsDidChangeNotification object:[NSUserDefaults standardUserDefaults]]; } - (void)viewDidDisappear:(BOOL)animated { [[NSNotificationCenter defaultCenter] removeObserver:self name:NSUserDefaultsDidChangeNotification object:nil]; [super viewDidDisappear:animated]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return YES; } - (void)dealloc { _currentSpecifier = nil; _checkedItem = nil; _settingsReader = nil; _settingsStore = nil; _tableView = nil; } #pragma mark - #pragma mark UITableView delegates - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [_currentSpecifier multipleValuesCount]; } - (void)selectCell:(UITableViewCell *)cell { [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; [[cell textLabel] setTextColor:kIASKgrayBlueColor]; } - (void)deselectCell:(UITableViewCell *)cell { [cell setAccessoryType:UITableViewCellAccessoryNone]; [[cell textLabel] setTextColor:[UIColor darkTextColor]]; } - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section { return [_currentSpecifier footerText]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellValue]; NSArray *titles = [_currentSpecifier multipleTitles]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellValue]; } if ([indexPath isEqual:[self checkedItem]]) { [self selectCell:cell]; } else { [self deselectCell:cell]; } @try { [[cell textLabel] setText:[self.settingsReader titleForStringId:[titles objectAtIndex:indexPath.row]]]; } @catch (NSException * e) {} return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath == [self checkedItem]) { [tableView deselectRowAtIndexPath:indexPath animated:YES]; return; } NSArray *values = [_currentSpecifier multipleValues]; [tableView deselectRowAtIndexPath:indexPath animated:YES]; [self deselectCell:[tableView cellForRowAtIndexPath:[self checkedItem]]]; [self selectCell:[tableView cellForRowAtIndexPath:indexPath]]; [self setCheckedItem:indexPath]; [self.settingsStore setObject:[values objectAtIndex:indexPath.row] forKey:[_currentSpecifier key]]; [self.settingsStore synchronize]; [[NSNotificationCenter defaultCenter] postNotificationName:kIASKAppSettingChanged object:[_currentSpecifier key] userInfo:[NSDictionary dictionaryWithObject:[values objectAtIndex:indexPath.row] forKey:[_currentSpecifier key]]]; } - (CGSize)contentSizeForViewInPopover { return [[self view] sizeThatFits:CGSizeMake(320, 2000)]; } #pragma mark Notifications - (void)userDefaultsDidChange { NSIndexPath *oldCheckedItem = self.checkedItem; if(_currentSpecifier) { [self updateCheckedItem]; } // only reload the table if it had changed; prevents animation cancellation if (![self.checkedItem isEqual:oldCheckedItem]) { [_tableView reloadData]; } } @end