blob: f1617887e06c9e51676caaa19a1f4ca162948ed4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
|
//
// 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<IASKSettingsStore>)settingsStore {
if(_settingsStore == nil) {
_settingsStore = [[IASKSettingsStoreUserDefaults alloc] init];
}
return _settingsStore;
}
- (void)viewDidLoad
{
[super viewDidLoad];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Done", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(handleBack)];
[backButton setBackgroundImage:[UIImage imageNamed:@"backButton"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
self.navigationItem.leftBarButtonItem = backButton;
self.view.backgroundColor = [UIColor colorWithRed:.968627451 green:.968627451 blue:.968627451 alpha:1.0];
}
- (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)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.tableView = nil;
}
- (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]]];
}
#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
|