-
Notifications
You must be signed in to change notification settings - Fork 1
/
EditKidViewController.swift
433 lines (361 loc) · 15.9 KB
/
EditKidViewController.swift
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
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
//
// EditKidViewController.swift
// Crummy
//
// Created by Randy McLain on 4/21/15.
// Copyright (c) 2015 CF. All rights reserved.
//
import UIKit
class EditKidViewController: UITableViewController, UITextFieldDelegate, UITextViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
// parameters
@IBOutlet weak var notesTextView: UITextView!
@IBOutlet weak var consultingNurseHotline: UITextField!
@IBOutlet weak var insuranceTextField: UITextField!
@IBOutlet weak var dobTableCell: UITableViewCell!
@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var birthdateLabel: UILabel!
@IBOutlet weak var dateButton: UIButton!
let animationDuration: Double = 0.3
let datePickerInterval: NSTimeInterval = 0.6
let astheticSpacing: CGFloat = 8.0
let datePickerHeight: CGFloat = 216.0
let pickerViewHeight: CGFloat = 250
let doneButtonHeight: CGFloat = 25
let doneButtonWidth: CGFloat = 50
let pickerWidth: CGFloat = 50
let crummyApiService = CrummyApiService()
var pickerIsUp: Bool = false
var pickerView: UIView!
var datePicker: UIDatePicker!
var guess: Int = 0
let pickerCellIndexPath = 4
let dateCellIndexPath = 1
var kidImage: UIImage?
var kidFormattedBirthdate :String?
var addKid = false
let titleFontSize: CGFloat = 26
let titleLabel = UILabel(frame: CGRectMake(0, 0, 80, 40))
let titleColor = UIColor(red: 0.060, green: 0.158, blue: 0.408, alpha: 1.000)
let blurViewTag = 99
let nameCellIndexPath = 0
let insuranceCellIndexPath = 2
let phoneCellIndexPath = 3
let thumbImageFile = "thumbImage.jpg"
let fullImageFile = "fullImage.jpg"
// person passed from the "list of people controller.
var selectedKid : Kid?
override func viewDidLoad() {
super.viewDidLoad()
self.titleLabel.font = UIFont(name: "HelveticaNeue-Light", size: self.titleFontSize)
self.titleLabel.textAlignment = .Center
self.titleLabel.textColor = self.titleColor
if let name = selectedKid?.name {
self.titleLabel.text = "Edit"
self.loadImage()
} else {
self.titleLabel.text = "Add"
}
self.navigationItem.titleView = self.titleLabel
var cellNib = UINib(nibName: "ImagePickerCell", bundle: nil)
tableView.registerNib(cellNib,
forCellReuseIdentifier: "ImagePickerCell")
if selectedKid == nil {
selectedKid = Kid(theName: "", theDOB: "", theInsuranceID: "", theNursePhone: "", theNotes: "", theKidID: "")
addKid = true
}
// setup tags
// assign the text fields tags.
self.nameTextField.tag = 0
self.insuranceTextField.tag = 2
self.consultingNurseHotline.tag = 3
self.notesTextView.tag = 4
// delegates
self.tableView.dataSource = self
self.tableView.delegate = self
self.notesTextView.delegate = self
self.consultingNurseHotline.delegate = self
self.insuranceTextField.delegate = self
self.nameTextField.delegate = self
// setup fields
self.nameTextField.text = selectedKid!.name
if selectedKid!.DOBString != "" && selectedKid!.DOBString != nil {
self.birthdateLabel.text = self.userDate(selectedKid!.DOBString!)
}
self.insuranceTextField.text = selectedKid!.insuranceId
self.consultingNurseHotline.text = selectedKid!.nursePhone
if selectedKid!.notes != "" {
self.notesTextView.text = selectedKid!.notes
}
self.view.layoutIfNeeded()
} // viewDidLoad
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "appWillResign", name: UIApplicationWillResignActiveNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "appBecameActive", name: UIApplicationDidBecomeActiveNotification, object: nil)
}
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
NSNotificationCenter.defaultCenter().removeObserver(self)
}
func appWillResign() {
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.ExtraLight)
var blurView = UIVisualEffectView(effect: blurEffect)
blurView.tag = self.blurViewTag
blurView.frame = self.view.frame
self.view.addSubview(blurView)
}
func appBecameActive() {
let blurView = self.view.viewWithTag(self.blurViewTag)
UIView.animateWithDuration(self.animationDuration, animations: { () -> Void in
blurView?.removeFromSuperview()
})
}
// MARK: - Date Picker
// func to set the date from the picker if no date is set.
// https://github.com/ioscreator/ioscreator/blob/master/IOSSwiftDatePickerTutorial/IOSSwiftDatePickerTutorial/ViewController.swift
func datePickerChanged(datePicker: UIDatePicker) {
var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy"
let strDate = dateFormatter.stringFromDate(datePicker.date)
selectedKid!.DOBString = strDate
if let birthdate = selectedKid!.DOBString {
self.birthdateLabel.text = self.userDate(birthdate)
}
birthdateLabel.textColor = UIColor.blackColor()
} // datePickerChanged
@IBAction func donePressed(sender: UIBarButtonItem) {
selectedKid!.notes = self.notesTextView.text
selectedKid!.name = self.nameTextField.text
selectedKid!.nursePhone = self.consultingNurseHotline.text
selectedKid!.insuranceId = self.insuranceTextField.text
if addKid == true {
self.crummyApiService.postNewKid(selectedKid!.name, dobString: selectedKid!.DOBString, insuranceID: selectedKid!.insuranceId, nursePhone: selectedKid!.nursePhone, notes: selectedKid!.notes!, completionHandler: { (id, status) -> Void in
if status! == "201" || status! == "200" {
// launch a popup signifying data saved.
self.selectedKid?.kidID = id!
if let image = self.kidImage {
self.saveImage(image)
}
self.navigationController?.popViewControllerAnimated(true)
}
})
} else {
self.crummyApiService.editKid(selectedKid!.kidID, name: selectedKid!.name, dobString: selectedKid!.DOBString, insuranceID: selectedKid!.insuranceId, nursePhone: selectedKid!.nursePhone, notes: selectedKid!.notes!, completionHandler: { (status, error) -> Void in
if let errorDescription = error {
let alertController = UIAlertController(title: "An Error Occurred", message: errorDescription, preferredStyle: .Alert)
let okAction = UIAlertAction(title: "OK", style: .Default, handler: { (alert) -> Void in
self.dismissViewControllerAnimated(true, completion: nil)
})
alertController.addAction(okAction)
self.presentViewController(alertController, animated: true, completion: nil)
} else {
self.navigationController?.popViewControllerAnimated(true)
}
})
} // else
}
func pickerCloserPressed(sender: AnyObject) {
self.datePickerChanged(datePicker)
self.dateButton.hidden = false
UIView.animateWithDuration(datePickerInterval, animations: { () -> Void in
self.pickerView.frame.origin.y = self.view.frame.height + self.datePickerHeight
})
// window is down
self.pickerIsUp = false
} // pickerCloserPressed
// MARK: - Date Button
@IBAction func datePressed() {
// if the button is pressed, it brings up the datePicker object.
self.dismisKeyboard()
self.pickerIsUp = true;
self.dateButton.hidden = true
pickerView = UIView(frame: CGRect(x: 0, y: self.view.frame.height, width: self.view.frame.width, height: pickerViewHeight))
pickerView.backgroundColor = UIColor.lightGrayColor()
self.view.addSubview(pickerView)
datePicker = UIDatePicker(frame: CGRect(x: 0, y: doneButtonHeight, width: pickerView.frame.width, height: datePickerHeight))
datePicker.datePickerMode = UIDatePickerMode.Date
datePicker.backgroundColor = UIColor.lightGrayColor()
if let birthDate = self.selectedKid?.DOBString {
if birthDate != "" {
var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy"
datePicker.date = dateFormatter.dateFromString(birthDate)!
}
}
// its off screen.
pickerView.addSubview(datePicker)
let pickerCloser = UIButton(frame: CGRect(x: 0, y: astheticSpacing, width: pickerWidth, height: doneButtonHeight))
pickerCloser.setTitle("Done", forState: UIControlState.Normal)
pickerCloser.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
pickerCloser.center.x = self.view.center.x
pickerView.addSubview(pickerCloser)
pickerCloser.addTarget(self, action: "pickerCloserPressed:", forControlEvents: UIControlEvents.TouchUpInside)
UIView.animateWithDuration(datePickerInterval, animations: { () -> Void in
self.pickerView.frame.origin.y = self.view.frame.height - self.datePickerHeight
})
// window is up
self.pickerIsUp = true
} // datePressed
func userDate (theDate : String) -> (String){
var dateFormatter = NSDateFormatter()
var dateFormatter2 = NSDateFormatter()
var theDateObject = NSDate()
dateFormatter.dateFormat = "MMMM dd, YYYY"
dateFormatter2.dateFormat = "dd-MM-yyyy"
theDateObject = dateFormatter2.dateFromString(theDate)!
return dateFormatter.stringFromDate(theDateObject)
}
// MARK: - Text Fields
func textFieldDidBeginEditing(textField: UITextField) {
// check to see if the picker visual is up, and if so move it down.
if pickerIsUp == true {
self.pickerCloserPressed(datePicker)
}
} // textFieldDidBeginEditing
func textFieldDidEndEditing(textField: UITextField) {
// if textfield == the outlet to an individual text field
switch textField.tag {
case 0:
selectedKid!.name = textField.text
case 2:
selectedKid!.insuranceId = textField.text
case 3:
selectedKid!.nursePhone = textField.text
case 4:
selectedKid!.notes = self.notesTextView!.text
default:
break
} // switch
textField.resignFirstResponder()
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
// MARK: - Logic
func getThisTextField (theRow : Int, theText : String) -> Void {
//take in a string value and set the kid object located in that field to that value. Pretty simple.
var text : String = theText
var row : Int = theRow
switch row {
case 0:
selectedKid!.name = text
case 1:
return selectedKid!.DOBString = text
case 2:
return selectedKid!.insuranceId = text
case 3:
return selectedKid!.nursePhone = text
case 4:
return selectedKid!.notes = notesTextView.text
default:
break
}
} // getThisTextField
func dismisKeyboard() {
if (self.nameTextField.isFirstResponder()) {
nameTextField.resignFirstResponder()
} else if
(self.insuranceTextField.isFirstResponder()) {
insuranceTextField.resignFirstResponder()
} else if
(self.consultingNurseHotline.isFirstResponder()) {
consultingNurseHotline.resignFirstResponder()
} else if
(self.notesTextView.isFirstResponder()) {
notesTextView.resignFirstResponder()
}
} // dismisKeyboard
//MARK:
//MARK: UITableViewDataSource
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if indexPath.row == self.pickerCellIndexPath {
let cell = tableView.dequeueReusableCellWithIdentifier("ImagePickerCell", forIndexPath: indexPath) as! ImagePickerCell
cell.kidImageView.image = self.kidImage
return cell
}
return super.tableView(tableView, cellForRowAtIndexPath: indexPath)
}
//MARK:
//MARK: UITableViewDelegate
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.tableView.deselectRowAtIndexPath(indexPath, animated: true)
if indexPath.row == self.pickerCellIndexPath {
let alertController = UIAlertController(title: "Add a Photo", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)
let addExistingPhotoAction = UIAlertAction(title: "Add an Existing Photo", style: .Default, handler: { (alert) -> Void in
var imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
imagePickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
imagePickerController.allowsEditing = true
self.presentViewController(imagePickerController, animated: true, completion: nil)
})
alertController.addAction(addExistingPhotoAction)
let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil)
alertController.addAction(cancelAction)
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) {
let takePhotoAction = UIAlertAction(title: "Take a Photo", style: .Default, handler: { (alert) -> Void in
var imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
imagePickerController.sourceType = UIImagePickerControllerSourceType.Camera
imagePickerController.allowsEditing = true
self.presentViewController(imagePickerController, animated: true, completion: nil)
})
alertController.addAction(takePhotoAction)
}
self.presentViewController(alertController, animated: true, completion: nil)
} else if indexPath.row == self.dateCellIndexPath {
if !pickerIsUp {
self.datePressed()
}
} else if indexPath.row == self.nameCellIndexPath {
self.nameTextField.becomeFirstResponder()
} else if indexPath.row == self.insuranceCellIndexPath {
self.insuranceTextField.becomeFirstResponder()
} else if indexPath.row == self.phoneCellIndexPath {
self.consultingNurseHotline.becomeFirstResponder()
}
}
//MARK:
//MARK: UIImagePickerControllerDelegate
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]){
if let photo = info[UIImagePickerControllerEditedImage] as? UIImage {
self.kidImage = photo
saveImage(photo)
}
tableView.reloadData()
picker.dismissViewControllerAnimated(true, completion: nil)
}
func imagePickerControllerDidCancel(picker: UIImagePickerController) {
picker.dismissViewControllerAnimated(true, completion: nil)
}
//MARK: Save Image
func saveImage(image: UIImage) {
if self.selectedKid != nil {
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
let documentsDirectoryPath = paths[0] as! String
let filePath = documentsDirectoryPath.stringByAppendingPathComponent("appData")
//var data = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? [String: AnyObject]
var data = [String: AnyObject]()
if let dataObj = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? [String: AnyObject] {
data = dataObj
}
let imageData = UIImageJPEGRepresentation(image, 1)
let customImageLocation = "kid_photo_\(self.selectedKid!.kidID)"
data[customImageLocation] = imageData
NSKeyedArchiver.archiveRootObject(data, toFile: filePath)
}
}
//MARK: Load Image
func loadImage() {
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
let documentsDirectoryPath = paths[0] as! String
let filePath = documentsDirectoryPath.stringByAppendingPathComponent("appData")
if NSFileManager.defaultManager().fileExistsAtPath(filePath) {
let savedData = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! [String: AnyObject]
let customImageLocation = "kid_photo_\(self.selectedKid!.kidID)"
if let imageData = savedData[customImageLocation] as? NSData {
self.kidImage = UIImage(data: imageData)
}
}
}
}