-
Notifications
You must be signed in to change notification settings - Fork 2
/
HEALEditSettingsViewController.m
211 lines (169 loc) · 6.7 KB
/
HEALEditSettingsViewController.m
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
205
206
207
208
209
210
211
//
// HEALEditSettingsViewController.m
// drinkingApp
//
// Created by Eivind Bakke on 2/26/14.
// Copyright (c) 2014 Halealei. All rights reserved.
//
#import "HEALEditSettingsViewController.h"
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
@interface HEALEditSettingsViewController ()
{
sexes newSex;
BOOL firstUse;
}
@end
@implementation HEALEditSettingsViewController
//############################################ Setup Interactive and Initialize SubViews and User Interaction When View Loads ############################################
- (void)viewDidLoad
{
[super viewDidLoad];
[self setupUI];
[self.navigationController setNavigationBarHidden:NO animated:YES];
if (!self.user) {
firstUse = YES;
self.user = [[HEALUser alloc]init];
}
}
// Setup all UI elements in the ViewController called from viewDidLoad only
- (void)setupUI
{
// Set background image
[self.imageViewBackground setImage:[UIImage imageNamed:@"empty.png"]];
if (IS_WIDESCREEN) {
[self.settingsHeader setHidden:NO];
}
// Initialize all the fields to have values from the user object
[self initFields];
// Setup gestures and textfield delegate
UITapGestureRecognizer *tapBackground = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapBackground:)];
[self.view addGestureRecognizer:tapBackground];
[[self weightTextField] setDelegate:self];
[[self nameTextField] setDelegate:self];
// We need a custom back button to be able to get the new night warning, but this removes the little arrow next to the button!!! Very annoying I know...
UIBarButtonItem *backButton = [[UIBarButtonItem alloc]
initWithTitle: @"Done"
style:UIBarButtonItemStyleDone
target:self
action:@selector(backButtonClicked)];
self.navigationItem.leftBarButtonItem = backButton;
}
// Initializes text fields and radiobuttons to reflect user object info
- (void)initFields
{
if (self.user.weight != 0) {
self.weightTextField.text = [NSString stringWithFormat:@"%d", self.user.weight];
self.nameTextField.text = self.user.name;
}
// Set the text in the textfields to come from the user defaults, if they have been set yet
if(self.user.sex == SEXES_FEMALE) {
[self.femaleRadioButton setSelected:YES];
} else if(self.user.sex == SEXES_MALE) {
[self.maleRadioButton setSelected:YES];
}
}
//############################################ Selectors to User Interaction ############################################
// Called when the user clicks the non-arrowed back button
- (void)backButtonClicked
{
if ([self userInfoUpdated] && (self.user.currentNight.drinks != 0)) {
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Warning"
message:@"Changing your data will start a new night."
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"OK", nil];
[alert show];
} else if (firstUse && [self userInfoUpdated]) {
[self performSegueWithIdentifier:@"settingsMainSegue" sender:self];
} else if ([self.weightTextField.text integerValue] == 0) {
[self.weightWarningLabel setHidden:NO];
} else {
[self.navigationController popViewControllerAnimated:YES];
}
}
// Called when the user interacts with pop up alert views
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 1) { // Button index 1 is the OK button in the New Night warning
[self updateUser];
[self.user.currentNight reset];
[self.navigationController popViewControllerAnimated:YES];
}
}
// When the user taps the background we want to collapse the keyboard
- (void)tapBackground:(UIGestureRecognizer *)gestureRecognizer;
{
[[self nameTextField] resignFirstResponder];
[[self weightTextField] resignFirstResponder];
}
// To get the keyboard to collapse when return is pressed
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
return [textField resignFirstResponder];
}
//############################################ Everything that happens when we leave the View Controller (Updating User, Checking for New Input etc.) ############################################
// When navigating away from the view controller, we want to save
- (void)viewDidDisappear:(BOOL)animated
{
if ([self userInfoUpdated]) {
[self updateUser];
}
}
// Updates the user in NSUserDefaults and in the User object
- (void)updateUser
{
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSNumber *weight = [NSNumber numberWithDouble:[[self.weightTextField text] doubleValue]];
[defaults setObject:weight forKey:@"userWeight"];
[defaults setObject:[self.nameTextField text] forKey:@"userName"];
if ([self.maleRadioButton isSelected])
{
[defaults setObject:@"M" forKey:@"userSex"];
}
else if([self.femaleRadioButton isSelected])
{
[defaults setObject:@"F" forKey:@"userSex"];
}
self.user.weight = [[self.weightTextField text] intValue];
self.user.name = [self.nameTextField text];
self.user.sex = newSex;
if (firstUse) {
[defaults setBool:YES forKey:@"userMade"];
}
@try {
[defaults synchronize];
}
@catch (NSException *exception) {
NSLog(@"Data save failed.");
}
}
// Checks if the info the user has entered is different from what is stored
- (BOOL)userInfoUpdated
{
[self setNewSex];
int currWeight = self.user.weight;
sexes currSex = self.user.sex;
if ((currWeight == [[self.weightTextField text] intValue]) && (currSex == newSex)) {
return NO;
} else {
return YES;
}
}
// Helper method to get the sex from the radiobuttons called from userInfoUpdated
- (void)setNewSex
{
if ([self.maleRadioButton isSelected]) {
newSex = SEXES_MALE;
} else if([self.femaleRadioButton isSelected]) {
newSex = SEXES_FEMALE;
}
}
//############################################ Segue ############################################
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([segue.identifier isEqualToString:@"settingsMainSegue"]) {
HEALMainViewController *mainController = [segue destinationViewController];
mainController.user = self.user;
}
}
@end