Modify This IOS APP
__MACOSX/._My Contact List
__MACOSX/My Contact List/._My Contact List
__MACOSX/My Contact List/._My Contact List.xcodeproj
__MACOSX/My Contact List/._.git
My Contact List/My Contact List/Constants.swift
// // Constants.swift // My Contact List // // Created by Michael Eierman on 8/6/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import Foundation struct Constants { static let kSortField = "sortField" static let kSortDirectionAscending = "sortDirectionAscending" }
__MACOSX/My Contact List/My Contact List/._Constants.swift
My Contact List/My Contact List/LocationDemoViewController.swift
// // LocationDemoViewController.swift // My Contact List // // Created by Michael Eierman on 8/6/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import UIKit import CoreLocation class LocationDemoViewController: UIViewController, CLLocationManagerDelegate { @IBOutlet weak var txtStreet: UITextField! @IBOutlet weak var txtCity: UITextField! @IBOutlet weak var txtState: UITextField! @IBOutlet weak var lblLatitude: UILabel! @IBOutlet weak var lblLongitude: UILabel! @IBOutlet weak var lblLocationAccuracy: UILabel! @IBOutlet weak var lblHeading: UILabel! @IBOutlet weak var lblHeadingAccuracy: UILabel! @IBOutlet weak var lblAltitude: UILabel! @IBOutlet weak var lblAltitudeAccuracy: UILabel! lazy var geoCoder = CLGeocoder() var locationManager: CLLocationManager! @objc func dismissKeyboard() { //Causes the view (or one of its embedded text fields) to resign the first responder status. view.endEditing(true) } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard)) view.addGestureRecognizer(tap) locationManager = CLLocationManager() locationManager.delegate = self locationManager.requestWhenInUseAuthorization() //ask for permission to use location } func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { if status == .authorizedWhenInUse { print("Permission granted") } else { print("Permission NOT granted") } } @IBAction func addressToCoordinates(_ sender: Any) { let address = "\(txtStreet.text!), \(txtCity.text!), \(txtState.text!))" geoCoder.geocodeAddressString(address) {(placemarks, error) in self.processAddressResponse(withPlacemarks: placemarks, error: error) } } private func processAddressResponse(withPlacemarks placemarks: [CLPlacemark]?, error: Error?) { if let error = error { print("Geocode Error: \(error)") } else { var bestMatch: CLLocation? if let placemarks = placemarks, placemarks.count > 0 { bestMatch = placemarks.first?.location } if let coordinate = bestMatch?.coordinate { lblLatitude.text = String(format: "%g\u{00B0}", coordinate.latitude) lblLongitude.text = String(format: "%g\u{00B0}", coordinate.longitude) } else { print("Didn't find any matching locations") } } } @IBAction func deviceCoordinates(_ sender: Any) { locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters locationManager.distanceFilter = 100 locationManager.startUpdatingLocation() locationManager.startUpdatingHeading() } override func viewDidDisappear(_ animated: Bool) { locationManager.stopUpdatingLocation() locationManager.stopUpdatingHeading() } func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { if let location = locations.last { let eventDate = location.timestamp let howRecent = eventDate.timeIntervalSinceNow if Double(howRecent) < 15.0 { let coordinate = location.coordinate lblLongitude.text = String(format: "%g\u{00B0}", coordinate.longitude) lblLatitude.text = String(format: "%g\u{00B0}", coordinate.latitude) lblLocationAccuracy.text = String(format: "%gm", location.horizontalAccuracy) lblAltitude.text = String(format: "%gm", location.altitude) lblAltitudeAccuracy.text = String(format: "%gm", location.verticalAccuracy) } } } func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) { if newHeading.headingAccuracy > 0 { let theHeading = newHeading.trueHeading var direction: String switch theHeading { case 225..<315: direction = "W" case 135..<225: direction = "S" case 45..<135: direction = "E" default: direction = "N" } lblHeading.text = String(format: "%g\u{00B0} (%@)", theHeading, direction) lblHeadingAccuracy.text = String(format: "%g\u{00B0}", newHeading.headingAccuracy) } } func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { let errorType = error._code == CLError.denied.rawValue ? "Location Permission Denied" : "Unknown Error" let alertController = UIAlertController(title: "Error Getting Location: \(errorType)", message: "Error Message: \(error.localizedDescription))", preferredStyle: .alert) let actionOK = UIAlertAction(title: "OK", style: .default, handler: nil) alertController.addAction(actionOK) present(alertController, animated: true, completion: nil) } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ }
__MACOSX/My Contact List/My Contact List/._LocationDemoViewController.swift
__MACOSX/My Contact List/My Contact List/._MyContactListModel.xcdatamodeld
My Contact List/My Contact List/MapViewController.swift
// // MapViewController.swift // My Contact List // // Created by Michael Eierman on 8/5/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import UIKit import MapKit import CoreData class MapViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate { @IBOutlet weak var mapView: MKMapView! @IBOutlet weak var sgmtMapType: UISegmentedControl! var locationManager: CLLocationManager! var contacts:[Contact] = [] override func viewDidLoad() { super.viewDidLoad() mapView.delegate = self locationManager = CLLocationManager() locationManager.delegate = self locationManager.requestWhenInUseAuthorization() // Do any additional setup after loading the view. } @IBAction func mapTypeChanged(_ sender: Any) { switch sgmtMapType.selectedSegmentIndex { case 0: mapView.mapType = .standard case 1: mapView.mapType = .hybrid case 2: mapView.mapType = .satellite default: break } } override func viewWillAppear(_ animated: Bool) { //Get contacts from Core Data let appDelegate = UIApplication.shared.delegate as! AppDelegate let context = appDelegate.persistentContainer.viewContext let request = NSFetchRequest<NSManagedObject>(entityName: "Contact") var fetchedObjects:[NSManagedObject] = [] do { fetchedObjects = try context.fetch(request) } catch let error as NSError { print("Could not fetch. \(error), \(error.userInfo)") } contacts = fetchedObjects as! [Contact] //remove all annotations self.mapView.removeAnnotations(self.mapView.annotations) //go through all contacts for contact in contacts { //as! [Contact] { let address = "\(contact.streetAddress!), \(contact.city!) \(contact.state!)" //geocoding let geoCoder = CLGeocoder() geoCoder.geocodeAddressString(address) {(placemarks, error) in self.processAddressResponse(contact, withPlacemarks: placemarks, error: error) } } } private func processAddressResponse(_ contact: Contact, withPlacemarks placemarks: [CLPlacemark]?, error: Error?) { if let error = error { print("Geocode Error: \(error)") } else { var bestMatch: CLLocation? if let placemarks = placemarks, placemarks.count > 0 { bestMatch = placemarks.first?.location } if let coordinate = bestMatch?.coordinate { let mp = MapPoint(latitude: coordinate.latitude, longitude: coordinate.longitude) mp.title = contact.contactName mp.subtitle = contact.streetAddress mapView.addAnnotation(mp) } else { print("Didn't find any matching locations") } } } @IBAction func findUser(_ sender: Any) { mapView.showAnnotations(mapView.annotations, animated: true) // mapView.showsUserLocation = true // mapView.setUserTrackingMode(.follow, animated: true) } func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) { var span = MKCoordinateSpan() span.latitudeDelta = 0.05 span.longitudeDelta = 0.05 let viewRegion = MKCoordinateRegion(center: userLocation.coordinate, span: span) mapView.setRegion(viewRegion, animated: true) // mapView.removeAnnotations(self.mapView.annotations) let mp = MapPoint(latitude: userLocation.coordinate.latitude, longitude: userLocation.coordinate.longitude) mp.title = "You" mp.subtitle = "Are here" mapView.addAnnotation(mp) } /* override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) mapView.setUserTrackingMode(.follow, animated: true) } */ /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ }
__MACOSX/My Contact List/My Contact List/._MapViewController.swift
My Contact List/My Contact List/MapPoint.swift
// // MapPoint.swift // My Contact List // // Created by Michael Eierman on 8/7/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import Foundation import MapKit class MapPoint: NSObject, MKAnnotation{ var title: String? var subtitle: String? var latitude: Double var longitude: Double var coordinate: CLLocationCoordinate2D { return CLLocationCoordinate2D(latitude: latitude, longitude: longitude) } init(latitude: Double, longitude: Double) { self.latitude = latitude self.longitude = longitude } }
__MACOSX/My Contact List/My Contact List/._MapPoint.swift
__MACOSX/My Contact List/My Contact List/._Assets.xcassets
My Contact List/My Contact List/ContactsViewController.swift
// // ContactsViewController.swift // My Contact List // // Created by Michael Eierman on 8/5/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import UIKit import CoreData import AVFoundation class ContactsViewController: UIViewController, UITextFieldDelegate, DateControllerDelegate,UIImagePickerControllerDelegate, UINavigationControllerDelegate{ var currentContact: Contact? let appDelegate = UIApplication.shared.delegate as! AppDelegate @IBOutlet weak var scrollView: UIScrollView! @IBOutlet weak var txtName: UITextField! @IBOutlet weak var txtAddress: UITextField! @IBOutlet weak var txtCity: UITextField! @IBOutlet weak var txtState: UITextField! @IBOutlet weak var txtZip: UITextField! @IBOutlet weak var txtCell: UITextField! @IBOutlet weak var txtPhone: UITextField! @IBOutlet weak var txtEmail: UITextField! @IBOutlet weak var lblBirthdate: UILabel! @IBOutlet weak var btnChange: UIButton! @IBOutlet weak var sgmtEditMode: UISegmentedControl! @IBOutlet weak var imgContactPicture: UIImageView! @IBOutlet weak var lblPhone: UILabel! @IBOutlet var settingsView: UIView! @IBAction func changePicture(_ sender: Any) { if AVCaptureDevice.authorizationStatus(for: AVMediaType.video) != AVAuthorizationStatus.authorized { //Camera not authorized let alertController = UIAlertController(title: "Camera Access Denied", message: "In order to take pictures, you need to allow the app to access the camera in the Settings.", preferredStyle: .alert) let actionSettings = UIAlertAction(title: "Open Settings", style: .default) {action in self.openSettings() } let actionCancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) alertController.addAction(actionSettings) alertController.addAction(actionCancel) present(alertController, animated: true, completion: nil) } else { // Already Authorized if UIImagePickerController.isSourceTypeAvailable(.camera){ let cameraController = UIImagePickerController() cameraController.sourceType = .camera cameraController.cameraCaptureMode = .photo cameraController.delegate = self cameraController.allowsEditing = true self.present(cameraController, animated: true, completion: nil) } } } func openSettings(){ if let settingsUrl = URL(string: UIApplication.openSettingsURLString) { if #available(iOS 10.0, *) { UIApplication.shared.open(settingsUrl, options: [:], completionHandler: nil) } else { UIApplication.shared.openURL(settingsUrl) } } } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let image = info[.editedImage] as? UIImage { imgContactPicture.contentMode = .scaleAspectFit imgContactPicture.image = image if currentContact == nil { let context = appDelegate.persistentContainer.viewContext currentContact = Contact(context: context) } currentContact?.image = image.jpegData(compressionQuality: 1.0) } dismiss(animated: true, completion: nil) } @IBAction func changeEditMode(_ sender: Any) { let textFields: [UITextField] = [txtName, txtAddress, txtCity, txtState, txtZip, txtPhone, txtCell, txtEmail] if sgmtEditMode.selectedSegmentIndex == 0 { for textField in textFields { textField.isEnabled = false textField.borderStyle = UITextField.BorderStyle.none } btnChange.isHidden = true navigationItem.rightBarButtonItem = nil } else if sgmtEditMode.selectedSegmentIndex == 1{ for textField in textFields { textField.isEnabled = true textField.borderStyle = UITextField.BorderStyle.roundedRect } btnChange.isHidden = false navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .save, target: self, action: #selector(self.saveContact)) } } func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { if currentContact == nil { let context = appDelegate.persistentContainer.viewContext currentContact = Contact(context: context) } currentContact?.contactName = txtName.text currentContact?.streetAddress = txtAddress.text currentContact?.city = txtCity.text currentContact?.state = txtState.text currentContact?.zipCode = txtZip.text currentContact?.cellNumber = txtCell.text currentContact?.phoneNumber = txtPhone.text currentContact?.email = txtEmail.text return true } @objc func saveContact() { appDelegate.saveContext() sgmtEditMode.selectedSegmentIndex = 0 changeEditMode(self) } override func viewDidLoad() { super.viewDidLoad() if currentContact != nil { txtName.text = currentContact!.contactName txtAddress.text = currentContact!.streetAddress txtCity.text = currentContact!.city txtState.text = currentContact!.state txtZip.text = currentContact!.zipCode txtPhone.text = currentContact!.phoneNumber txtCell.text = currentContact!.cellNumber txtEmail.text = currentContact!.email let formatter = DateFormatter() formatter.dateStyle = .short if currentContact!.birthday != nil { lblBirthdate.text = formatter.string(from: currentContact!.birthday!) } if let imageData = currentContact?.image { imgContactPicture.image = UIImage(data: imageData) } let longPress = UILongPressGestureRecognizer.init(target: self, action: #selector(callPhone(gesture:))) lblPhone.addGestureRecognizer(longPress) } self.changeEditMode(self) let textFields: [UITextField] = [txtName, txtAddress, txtCity, txtState, txtZip, txtPhone, txtCell, txtEmail] for textfield in textFields { textfield.addTarget(self, action: #selector(UITextFieldDelegate.textFieldShouldEndEditing(_:)), for: UIControl.Event.editingDidEnd) } } @objc func callPhone(gesture: UILongPressGestureRecognizer) { if gesture.state == .began { let number = txtPhone.text if number!.count > 0 { //Don't call blank numbers let url = NSURL(string: "telprompt://\(number!)") UIApplication.shared.open(url! as URL, options: [:], completionHandler: nil) print("Calling Phone Number: \(url!)") } } } func dateChanged(date: Date) { if currentContact == nil { let context = appDelegate.persistentContainer.viewContext currentContact = Contact(context: context) } currentContact?.birthday = date let formatter = DateFormatter() formatter.dateStyle = .short lblBirthdate.text = formatter.string(from: date) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.registerKeyboardNotifications() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) self.unregisterKeyboardNotifications() } func registerKeyboardNotifications() { NotificationCenter.default.addObserver(self, selector: #selector(ContactsViewController.keyboardDidShow(notification:)), name: UIResponder.keyboardDidShowNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(ContactsViewController.keyboardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil) } func unregisterKeyboardNotifications() { NotificationCenter.default.removeObserver(self) } @objc func keyboardDidShow(notification: NSNotification) { let userInfo: NSDictionary = notification.userInfo! as NSDictionary let keyboardInfo = userInfo[UIResponder.keyboardFrameBeginUserInfoKey] as! NSValue let keyboardSize = keyboardInfo.cgRectValue.size // Get the existing contentInset for the scrollView and set the bottom property to //be the height of the keyboard var contentInset = self.scrollView.contentInset contentInset.bottom = keyboardSize.height self.scrollView.contentInset = contentInset self.scrollView.scrollIndicatorInsets = contentInset } @objc func keyboardWillHide(notification: NSNotification) { var contentInset = self.scrollView.contentInset contentInset.bottom = 0 self.scrollView.contentInset = contentInset self.scrollView.scrollIndicatorInsets = UIEdgeInsets.zero } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if(segue.identifier == "segueContactDate"){ let dateController = segue.destination as! DateViewController dateController.delegate = self } } }
__MACOSX/My Contact List/My Contact List/._ContactsViewController.swift
__MACOSX/My Contact List/My Contact List/._Base.lproj
My Contact List/My Contact List/AppDelegate.swift
// // AppDelegate.swift // My Contact List // // Created by Michael Eierman on 8/2/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import UIKit import CoreData import CoreMotion @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? lazy var motionManager = CMMotionManager() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. let settings = UserDefaults.standard if settings.string(forKey: Constants.kSortField) == nil { settings.set("city", forKey: Constants.kSortField) } if settings.string(forKey: Constants.kSortDirectionAscending) == nil { settings.set(true, forKey: Constants.kSortDirectionAscending) } settings.synchronize() NSLog("Sort field: %@", settings.string(forKey: Constants.kSortField)!) NSLog("Sort direction: \(settings.bool(forKey: Constants.kSortDirectionAscending))") return true } func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. } func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } func applicationWillEnterForeground(_ application: UIApplication) { // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. } func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } lazy var persistentContainer: NSPersistentContainer = { /* The persistent container for the application. This implementation creates and returns a container, having loaded the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail. */ let container = NSPersistentContainer(name: "MyContactListModel") container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { // Replace this implementation with code to handle the error appropriately. // fatalError() causes the application to generate a crash log and terminate. You should // not use this function in a shipping application, although it may be useful during // development. /* Typical reasons for an error here include: * The parent directory does not exist, cannot be created, or disallows writing. * The persistent store is not accessible, due to permissions or data protection when * the device is locked. * The device is out of space. * The store could not be migrated to the current model version. Check the error message to determine what the actual problem was. */ fatalError("Unresolved error \(error), \(error.userInfo)") } }) return container }() // MARK: - Core Data Saving support func saveContext () { let context = persistentContainer.viewContext if context.hasChanges { do { try context.save() } catch { // Replace this implementation with code to handle the error appropriately. // fatalError() causes the application to generate a crash log and terminate. You should // not use this function in a shipping application, although it may be useful during // development. let nserror = error as NSError fatalError("Unresolved error \(nserror), \(nserror.userInfo)") } } } }
__MACOSX/My Contact List/My Contact List/._AppDelegate.swift
My Contact List/My Contact List/ContactsTableViewController.swift
// // ContactsTableViewController.swift // My Contact List // // Created by Michael Eierman on 8/6/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import UIKit import CoreData class ContactsTableViewController: UITableViewController { // let contacts = ["Jim", "John", "Dana", "Rosie", "Justin", "Jeremy", "Sarah", "Matt", "Joe", "Donald", "Jeff"] var contacts:[NSManagedObject] = [] let appDelegate = UIApplication.shared.delegate as! AppDelegate override func viewDidLoad() { super.viewDidLoad() self.navigationItem.leftBarButtonItem = self.editButtonItem loadDataFromDatabase() } override func viewWillAppear(_ animated: Bool) { loadDataFromDatabase() tableView.reloadData() } func loadDataFromDatabase() { let settings = UserDefaults.standard let sortField = settings.string(forKey: Constants.kSortField) let sortAscending = settings.bool(forKey: Constants.kSortDirectionAscending) //Set up Core Data Context let context = appDelegate.persistentContainer.viewContext //Set up Request let request = NSFetchRequest<NSManagedObject>(entityName: "Contact") //Specify sorting let sortDescriptor = NSSortDescriptor(key: sortField, ascending: sortAscending) let sortDescriptorArray = [sortDescriptor] //to sort by multiple fields, add more sort descriptors to the array request.sortDescriptors = sortDescriptorArray do { contacts = try context.fetch(request) } catch let error as NSError { print("Could not fetch. \(error), \(error.userInfo)") } } // MARK: - Table view data source override func numberOfSections(in tableView: UITableView) -> Int { return 1 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return contacts.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "ContactsCell", for: indexPath) // Configure the cell... let contact = contacts[indexPath.row] as? Contact cell.textLabel?.text = contact?.contactName cell.detailTextLabel?.text = contact?.city cell.accessoryType = .detailDisclosureButton return cell } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let selectedContact = contacts[indexPath.row] as? Contact let name = selectedContact!.contactName! let actionHandler = { (action:UIAlertAction!) -> Void in let storyboard = UIStoryboard(name: "Main", bundle: nil) let controller = storyboard.instantiateViewController(withIdentifier: "ContactController") as? ContactsViewController controller?.currentContact = selectedContact self.navigationController?.pushViewController(controller!, animated: true) } let alertController = UIAlertController(title: "Contact selected", message: "Selected row: \(indexPath.row) (\(name))", preferredStyle: .alert) let actionCancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) let actionDetails = UIAlertAction(title: "Show Details", style: .default, handler: actionHandler) alertController.addAction(actionCancel) alertController.addAction(actionDetails) present(alertController, animated: true, completion: nil) } /* // Override to support conditional editing of the table view. override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { // Return false if you do not want the specified item to be editable. return true } */ override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { // Delete the row from the data source let contact = contacts[indexPath.row] as? Contact let context = appDelegate.persistentContainer.viewContext context.delete(contact!) do { try context.save() } catch { fatalError("Error saving context: \(error)") } loadDataFromDatabase() tableView.deleteRows(at: [indexPath], with: .fade) } else if editingStyle == .insert { // Create a new instance of the appropriate class, insert it into the array, //and add a new row to the table view } } /* // Override to support rearranging the table view. override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { } */ /* // Override to support conditional rearranging of the table view. override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { // Return false if you do not want the item to be re-orderable. return true } */ /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "EditContact" { let contactController = segue.destination as? ContactsViewController let selectedRow = self.tableView.indexPath(for: sender as! UITableViewCell)?.row let selectedContact = contacts[selectedRow!] as? Contact contactController?.currentContact = selectedContact! } } }
__MACOSX/My Contact List/My Contact List/._ContactsTableViewController.swift
My Contact List/My Contact List/DateViewController.swift
// // DateViewController.swift // My Contact List // // Created by Michael Eierman on 8/6/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import UIKit protocol DateControllerDelegate: class { func dateChanged(date: Date) } class DateViewController: UIViewController { weak var delegate: DateControllerDelegate? @IBOutlet weak var dtpDate: UIDatePicker! override func viewDidLoad() { super.viewDidLoad() let saveButton: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.save, target: self, action: #selector(saveDate)) self.navigationItem.rightBarButtonItem = saveButton self.title = "Pick Birthdate" } @objc func saveDate(){ self.delegate?.dateChanged(date: dtpDate.date) self.navigationController?.popViewController(animated: true) } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ }
__MACOSX/My Contact List/My Contact List/._DateViewController.swift
My Contact List/My Contact List/Info.plist
NSCameraUsageDescription Just need it CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleVersion 1 LSRequiresIPhoneOS NSLocationWhenInUseUsageDescription We need to know where we're at! UILaunchStoryboardName LaunchScreen UIMainStoryboardFile Main UIRequiredDeviceCapabilities armv7 UIStatusBarTintParameters UINavigationBar Style UIBarStyleDefault Translucent UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight
__MACOSX/My Contact List/My Contact List/._Info.plist
My Contact List/My Contact List/SettingsViewController.swift
// // SettingsViewController.swift // My Contact List // // Created by Michael Eierman on 8/5/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import UIKit import CoreMotion class SettingsViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { @IBOutlet var settingsView: UIView! @IBOutlet weak var swAscending: UISwitch! @IBOutlet weak var pckSortField: UIPickerView! @IBOutlet weak var lblBattery: UILabel! let sortOrderItems: Array<String> = ["contactName", "city", "birthday"] override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. pckSortField.dataSource = self; pckSortField.delegate = self; UIDevice.current.isBatteryMonitoringEnabled = true NotificationCenter.default.addObserver(self, selector: #selector(self.batteryChanged), name: UIDevice.batteryStateDidChangeNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.batteryChanged), name: UIDevice.batteryLevelDidChangeNotification, object: nil) self.batteryChanged() } func startMotionDetection(){ let appDelegate = UIApplication.shared.delegate as! AppDelegate let mManager = appDelegate.motionManager if mManager.isAccelerometerAvailable { mManager.accelerometerUpdateInterval = 0.05 mManager.startAccelerometerUpdates(to: OperationQueue.main) { (data: CMAccelerometerData?, error: Error?) in self.updateLabel(data: data!) } } } func updateLabel(data: CMAccelerometerData){ let statusBarHeight = UIApplication.shared.statusBarFrame.height let tabBarHeight = self.tabBarController?.tabBar.frame.height let moveFactor:Double = 15.0 var rect = lblBattery.frame let moveToX = Double(rect.origin.x) + data.acceleration.x * moveFactor let moveToY = Double(rect.origin.y + rect.size.height) - (data.acceleration.y * moveFactor) let maxX = Double(settingsView.frame.size.width - rect.width) let maxY = Double(settingsView.frame.size.height - tabBarHeight!) let minY = Double(rect.size.height + statusBarHeight) if(moveToX > 0 && moveToX < maxX){ rect.origin.x += CGFloat(data.acceleration.x * moveFactor) } if(moveToY > minY && moveToY < maxY){ rect.origin.y -= CGFloat(data.acceleration.y * moveFactor); } UIView.animate(withDuration: TimeInterval(0), delay: TimeInterval(0), options: UIView.AnimationOptions.curveEaseInOut, animations: {self.lblBattery.frame = rect}, completion: nil) } @objc func batteryChanged(){ let device = UIDevice.current var batteryState: String switch(device.batteryState){ case .charging: batteryState = "+" case .full: batteryState = "!" case .unplugged: batteryState = "-" case .unknown: batteryState = "?" @unknown default: fatalError() } let batteryLevelPercent = device.batteryLevel * 100 let batteryLevel = String(format: "%.0f%%", batteryLevelPercent) let batteryStatus = "\(batteryLevel) (\(batteryState))" lblBattery.text = batteryStatus } override func viewDidAppear(_ animated: Bool) { let device = UIDevice.current print("Device Info:") print("Name: \(device.name)") print("Model: \(device.model)") print("System Name: \(device.systemName)") print("System Version: \(device.systemVersion)") print("Identifier: \(device.identifierForVendor!)") let orientation: String switch device.orientation { case .faceDown: orientation = "Face Down" case .landscapeLeft: orientation = "Landscape Left" case .portrait: orientation="Portrait" case .landscapeRight: orientation = "Landscape Right" case .faceUp: orientation = "Face Up" case .portraitUpsideDown: orientation = "Portrait Upside Down" case .unknown: orientation = "Unknown Orientation" @unknown default: fatalError() } print("Orientation: \(orientation)") self.startMotionDetection() } override func viewWillAppear(_ animated: Bool) { //set the UI based on values in UserDefaults let settings = UserDefaults.standard swAscending.setOn(settings.bool(forKey: Constants.kSortDirectionAscending), animated: true) let sortField = settings.string(forKey: Constants.kSortField) var i = 0 for field in sortOrderItems { if field == sortField { pckSortField.selectRow(i, inComponent: 0, animated: false) } i += 1 } pckSortField.reloadComponent(0) } override func viewDidDisappear(_ animated: Bool) { UIDevice.current.isBatteryMonitoringEnabled = false let appDelegate = UIApplication.shared.delegate as? AppDelegate appDelegate?.motionManager.stopAccelerometerUpdates() } @IBAction func sortDirectionChanged(_ sender: Any) { let settings = UserDefaults.standard settings.set(swAscending.isOn, forKey: Constants.kSortDirectionAscending) settings.synchronize() } // MARK: UIPickerViewDelegate Methods // Returns the number of 'columns' to display. func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } // Returns the # of rows in the picker func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return sortOrderItems.count } //Sets the value that is shown for each row in the picker func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return sortOrderItems[row] } //If the user chooses from the pickerview, it calls this function; func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { let sortField = sortOrderItems[row] let settings = UserDefaults.standard settings.set(sortField, forKey: Constants.kSortField) settings.synchronize() } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ }
__MACOSX/My Contact List/My Contact List/._SettingsViewController.swift
My Contact List/My Contact List.xcodeproj/project.pbxproj
// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 50; objects = { /* Begin PBXBuildFile section */ 1E31C16722F9CDBE0072F69E /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E31C16622F9CDBE0072F69E /* Constants.swift */; }; 1E31C18B22F9D0580072F69E /* MyContactListModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 1E31C18922F9D0580072F69E /* MyContactListModel.xcdatamodeld */; }; 1E31C18D22F9DC4C0072F69E /* DateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E31C18C22F9DC4C0072F69E /* DateViewController.swift */; }; 1E31C18F22F9E52B0072F69E /* ContactsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E31C18E22F9E52B0072F69E /* ContactsTableViewController.swift */; }; 1E31C19122F9FEEB0072F69E /* LocationDemoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E31C19022F9FEEB0072F69E /* LocationDemoViewController.swift */; }; 1E31C19322FB2ECF0072F69E /* MapPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E31C19222FB2ECF0072F69E /* MapPoint.swift */; }; 1E34AC7B22F4A36C00342F01 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E34AC7A22F4A36C00342F01 /* AppDelegate.swift */; }; 1E34AC8222F4A36C00342F01 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1E34AC8022F4A36C00342F01 /* Main.storyboard */; }; 1E34AC8422F4A36E00342F01 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1E34AC8322F4A36E00342F01 /* Assets.xcassets */; }; 1E34AC8722F4A36E00342F01 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1E34AC8522F4A36E00342F01 /* LaunchScreen.storyboard */; }; 1E34AC8F22F8851A00342F01 /* ContactsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E34AC8E22F8851A00342F01 /* ContactsViewController.swift */; }; 1E34AC9122F8852700342F01 /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E34AC9022F8852700342F01 /* SettingsViewController.swift */; }; 1E34AC9322F8853600342F01 /* MapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E34AC9222F8853600342F01 /* MapViewController.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 1E31C16622F9CDBE0072F69E /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; }; 1E31C18A22F9D0580072F69E /* MyContactListModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MyContactListModel.xcdatamodel; sourceTree = "<group>"; }; 1E31C18C22F9DC4C0072F69E /* DateViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateViewController.swift; sourceTree = "<group>"; }; 1E31C18E22F9E52B0072F69E /* ContactsTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactsTableViewController.swift; sourceTree = "<group>"; }; 1E31C19022F9FEEB0072F69E /* LocationDemoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationDemoViewController.swift; sourceTree = "<group>"; }; 1E31C19222FB2ECF0072F69E /* MapPoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapPoint.swift; sourceTree = "<group>"; }; 1E34AC7722F4A36C00342F01 /* My Contact List.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "My Contact List.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 1E34AC7A22F4A36C00342F01 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 1E34AC8122F4A36C00342F01 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; 1E34AC8322F4A36E00342F01 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 1E34AC8622F4A36E00342F01 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 1E34AC8822F4A36E00342F01 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 1E34AC8E22F8851A00342F01 /* ContactsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactsViewController.swift; sourceTree = "<group>"; }; 1E34AC9022F8852700342F01 /* SettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = "<group>"; }; 1E34AC9222F8853600342F01 /* MapViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapViewController.swift; sourceTree = "<group>"; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 1E34AC7422F4A36C00342F01 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 1E34AC6E22F4A36C00342F01 = { isa = PBXGroup; children = ( 1E34AC7922F4A36C00342F01 /* My Contact List */, 1E34AC7822F4A36C00342F01 /* Products */, ); sourceTree = "<group>"; }; 1E34AC7822F4A36C00342F01 /* Products */ = { isa = PBXGroup; children = ( 1E34AC7722F4A36C00342F01 /* My Contact List.app */, ); name = Products; sourceTree = "<group>"; }; 1E34AC7922F4A36C00342F01 /* My Contact List */ = { isa = PBXGroup; children = ( 1E34AC7A22F4A36C00342F01 /* AppDelegate.swift */, 1E34AC8022F4A36C00342F01 /* Main.storyboard */, 1E34AC8322F4A36E00342F01 /* Assets.xcassets */, 1E34AC8522F4A36E00342F01 /* LaunchScreen.storyboard */, 1E34AC8822F4A36E00342F01 /* Info.plist */, 1E34AC8E22F8851A00342F01 /* ContactsViewController.swift */, 1E34AC9022F8852700342F01 /* SettingsViewController.swift */, 1E34AC9222F8853600342F01 /* MapViewController.swift */, 1E31C16622F9CDBE0072F69E /* Constants.swift */, 1E31C18922F9D0580072F69E /* MyContactListModel.xcdatamodeld */, 1E31C18C22F9DC4C0072F69E /* DateViewController.swift */, 1E31C18E22F9E52B0072F69E /* ContactsTableViewController.swift */, 1E31C19022F9FEEB0072F69E /* LocationDemoViewController.swift */, 1E31C19222FB2ECF0072F69E /* MapPoint.swift */, ); path = "My Contact List"; sourceTree = "<group>"; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 1E34AC7622F4A36C00342F01 /* My Contact List */ = { isa = PBXNativeTarget; buildConfigurationList = 1E34AC8B22F4A36E00342F01 /* Build configuration list for PBXNativeTarget "My Contact List" */; buildPhases = ( 1E34AC7322F4A36C00342F01 /* Sources */, 1E34AC7422F4A36C00342F01 /* Frameworks */, 1E34AC7522F4A36C00342F01 /* Resources */, ); buildRules = ( ); dependencies = ( ); name = "My Contact List"; productName = "My Contact List"; productReference = 1E34AC7722F4A36C00342F01 /* My Contact List.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 1E34AC6F22F4A36C00342F01 /* Project object */ = { isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1030; LastUpgradeCheck = 1030; ORGANIZATIONNAME = "Learning Mobile Apps"; TargetAttributes = { 1E34AC7622F4A36C00342F01 = { CreatedOnToolsVersion = 10.3; }; }; }; buildConfigurationList = 1E34AC7222F4A36C00342F01 /* Build configuration list for PBXProject "My Contact List" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 1E34AC6E22F4A36C00342F01; productRefGroup = 1E34AC7822F4A36C00342F01 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 1E34AC7622F4A36C00342F01 /* My Contact List */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 1E34AC7522F4A36C00342F01 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 1E34AC8722F4A36E00342F01 /* LaunchScreen.storyboard in Resources */, 1E34AC8422F4A36E00342F01 /* Assets.xcassets in Resources */, 1E34AC8222F4A36C00342F01 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 1E34AC7322F4A36C00342F01 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 1E31C16722F9CDBE0072F69E /* Constants.swift in Sources */, 1E34AC9322F8853600342F01 /* MapViewController.swift in Sources */, 1E31C18D22F9DC4C0072F69E /* DateViewController.swift in Sources */, 1E31C18B22F9D0580072F69E /* MyContactListModel.xcdatamodeld in Sources */, 1E31C19122F9FEEB0072F69E /* LocationDemoViewController.swift in Sources */, 1E34AC8F22F8851A00342F01 /* ContactsViewController.swift in Sources */, 1E34AC7B22F4A36C00342F01 /* AppDelegate.swift in Sources */, 1E31C19322FB2ECF0072F69E /* MapPoint.swift in Sources */, 1E31C18F22F9E52B0072F69E /* ContactsTableViewController.swift in Sources */, 1E34AC9122F8852700342F01 /* SettingsViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 1E34AC8022F4A36C00342F01 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( 1E34AC8122F4A36C00342F01 /* Base */, ); name = Main.storyboard; sourceTree = "<group>"; }; 1E34AC8522F4A36E00342F01 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( 1E34AC8622F4A36E00342F01 /* Base */, ); name = LaunchScreen.storyboard; sourceTree = "<group>"; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 1E34AC8922F4A36E00342F01 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 12.4; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; 1E34AC8A22F4A36E00342F01 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 12.4; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; VALIDATE_PRODUCT = YES; }; name = Release; }; 1E34AC8C22F4A36E00342F01 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = UJ95TM9W58; INFOPLIST_FILE = "My Contact List/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = "com.company.versionthree.My-Contact-List"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; 1E34AC8D22F4A36E00342F01 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = UJ95TM9W58; INFOPLIST_FILE = "My Contact List/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = "com.company.versionthree.My-Contact-List"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1E34AC7222F4A36C00342F01 /* Build configuration list for PBXProject "My Contact List" */ = { isa = XCConfigurationList; buildConfigurations = ( 1E34AC8922F4A36E00342F01 /* Debug */, 1E34AC8A22F4A36E00342F01 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 1E34AC8B22F4A36E00342F01 /* Build configuration list for PBXNativeTarget "My Contact List" */ = { isa = XCConfigurationList; buildConfigurations = ( 1E34AC8C22F4A36E00342F01 /* Debug */, 1E34AC8D22F4A36E00342F01 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ /* Begin XCVersionGroup section */ 1E31C18922F9D0580072F69E /* MyContactListModel.xcdatamodeld */ = { isa = XCVersionGroup; children = ( 1E31C18A22F9D0580072F69E /* MyContactListModel.xcdatamodel */, ); currentVersion = 1E31C18A22F9D0580072F69E /* MyContactListModel.xcdatamodel */; path = MyContactListModel.xcdatamodeld; sourceTree = "<group>"; versionGroupType = wrapper.xcdatamodel; }; /* End XCVersionGroup section */ }; rootObject = 1E34AC6F22F4A36C00342F01 /* Project object */; }
__MACOSX/My Contact List/My Contact List.xcodeproj/._project.pbxproj
__MACOSX/My Contact List/My Contact List.xcodeproj/._xcuserdata
__MACOSX/My Contact List/My Contact List.xcodeproj/._project.xcworkspace
My Contact List/.git/config
[core] bare = false repositoryformatversion = 0 filemode = true ignorecase = true precomposeunicode = true logallrefupdates = true
__MACOSX/My Contact List/.git/._config
__MACOSX/My Contact List/.git/._objects
My Contact List/.git/HEAD
ref: refs/heads/master
__MACOSX/My Contact List/.git/._HEAD
__MACOSX/My Contact List/.git/._info
My Contact List/.git/description
Unnamed repository; edit this file 'description' to name the repository.
__MACOSX/My Contact List/.git/._description
__MACOSX/My Contact List/.git/._hooks
__MACOSX/My Contact List/.git/._refs
My Contact List/.git/index
__MACOSX/My Contact List/.git/._index
__MACOSX/My Contact List/My Contact List/MyContactListModel.xcdatamodeld/._MyContactListModel.xcdatamodel
__MACOSX/My Contact List/My Contact List/Assets.xcassets/._sample-881-globe.imageset
__MACOSX/My Contact List/My Contact List/Assets.xcassets/._AppIcon.appiconset
__MACOSX/My Contact List/My Contact List/Assets.xcassets/._second.imageset
__MACOSX/My Contact List/My Contact List/Assets.xcassets/._first.imageset
My Contact List/My Contact List/Assets.xcassets/Contents.json
{ "info" : { "version" : 1, "author" : "xcode" } }
__MACOSX/My Contact List/My Contact List/Assets.xcassets/._Contents.json
__MACOSX/My Contact List/My Contact List/Assets.xcassets/._sample-834-bolt.imageset
My Contact List/My Contact List/Base.lproj/LaunchScreen.storyboard
__MACOSX/My Contact List/My Contact List/Base.lproj/._LaunchScreen.storyboard
My Contact List/My Contact List/Base.lproj/Main.storyboard
__MACOSX/My Contact List/My Contact List/Base.lproj/._Main.storyboard
__MACOSX/My Contact List/My Contact List.xcodeproj/xcuserdata/._eierman.xcuserdatad
My Contact List/My Contact List.xcodeproj/project.xcworkspace/contents.xcworkspacedata
__MACOSX/My Contact List/My Contact List.xcodeproj/project.xcworkspace/._contents.xcworkspacedata
__MACOSX/My Contact List/My Contact List.xcodeproj/project.xcworkspace/._xcuserdata
__MACOSX/My Contact List/My Contact List.xcodeproj/project.xcworkspace/._xcshareddata
__MACOSX/My Contact List/.git/objects/._51
__MACOSX/My Contact List/.git/objects/._93
__MACOSX/My Contact List/.git/objects/._94
__MACOSX/My Contact List/.git/objects/._b2
__MACOSX/My Contact List/.git/objects/._da
__MACOSX/My Contact List/.git/objects/._bd
__MACOSX/My Contact List/.git/objects/._d1
__MACOSX/My Contact List/.git/objects/._c0
__MACOSX/My Contact List/.git/objects/._pack
__MACOSX/My Contact List/.git/objects/._11
__MACOSX/My Contact List/.git/objects/._74
__MACOSX/My Contact List/.git/objects/._44
__MACOSX/My Contact List/.git/objects/._info
__MACOSX/My Contact List/.git/objects/._a9
__MACOSX/My Contact List/.git/objects/._f9
__MACOSX/My Contact List/.git/objects/._48
__MACOSX/My Contact List/.git/objects/._1e
__MACOSX/My Contact List/.git/objects/._78
__MACOSX/My Contact List/.git/objects/._7f
My Contact List/.git/info/exclude
.DS_Store UserInterfaceState.xcuserstate
__MACOSX/My Contact List/.git/info/._exclude
My Contact List/.git/hooks/README.sample
#!/bin/sh # # Place appropriately named executable hook scripts into this directory # to intercept various actions that git takes. See `git help hooks` for # more information.
__MACOSX/My Contact List/.git/hooks/._README.sample
__MACOSX/My Contact List/.git/refs/._heads
__MACOSX/My Contact List/.git/refs/._tags
My Contact List/My Contact List/MyContactListModel.xcdatamodeld/MyContactListModel.xcdatamodel/contents
__MACOSX/My Contact List/My Contact List/MyContactListModel.xcdatamodeld/MyContactListModel.xcdatamodel/._contents
My Contact List/My Contact List/Assets.xcassets/sample-881-globe.imageset/sample-401-globe.png
__MACOSX/My Contact List/My Contact List/Assets.xcassets/sample-881-globe.imageset/._sample-401-globe.png
My Contact List/My Contact List/Assets.xcassets/sample-881-globe.imageset/[email protected]
__MACOSX/My Contact List/My Contact List/Assets.xcassets/sample-881-globe.imageset/[email protected]
My Contact List/My Contact List/Assets.xcassets/sample-881-globe.imageset/Contents.json
{ "images" : [ { "idiom" : "universal", "filename" : "sample-401-globe.png", "scale" : "1x" }, { "idiom" : "universal", "filename" : "[email protected]", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } }
__MACOSX/My Contact List/My Contact List/Assets.xcassets/sample-881-globe.imageset/._Contents.json
My Contact List/My Contact List/Assets.xcassets/AppIcon.appiconset/Contents.json
{ "images" : [ { "idiom" : "iphone", "size" : "20x20", "scale" : "2x" }, { "idiom" : "iphone", "size" : "20x20", "scale" : "3x" }, { "idiom" : "iphone", "size" : "29x29", "scale" : "2x" }, { "idiom" : "iphone", "size" : "29x29", "scale" : "3x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "3x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "3x" }, { "idiom" : "ipad", "size" : "20x20", "scale" : "1x" }, { "idiom" : "ipad", "size" : "20x20", "scale" : "2x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "1x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "2x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "1x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "2x" }, { "idiom" : "ipad", "size" : "76x76", "scale" : "1x" }, { "idiom" : "ipad", "size" : "76x76", "scale" : "2x" }, { "idiom" : "ipad", "size" : "83.5x83.5", "scale" : "2x" }, { "idiom" : "ios-marketing", "size" : "1024x1024", "scale" : "1x" } ], "info" : { "version" : 1, "author" : "xcode" } }
__MACOSX/My Contact List/My Contact List/Assets.xcassets/AppIcon.appiconset/._Contents.json
My Contact List/My Contact List/Assets.xcassets/second.imageset/second.pdf
__MACOSX/My Contact List/My Contact List/Assets.xcassets/second.imageset/._second.pdf
My Contact List/My Contact List/Assets.xcassets/second.imageset/Contents.json
{ "images" : [ { "idiom" : "universal", "filename" : "second.pdf" } ], "info" : { "version" : 1, "author" : "xcode" } }
__MACOSX/My Contact List/My Contact List/Assets.xcassets/second.imageset/._Contents.json
My Contact List/My Contact List/Assets.xcassets/first.imageset/Contents.json
{ "images" : [ { "idiom" : "universal", "filename" : "first.pdf" } ], "info" : { "version" : 1, "author" : "xcode" } }
__MACOSX/My Contact List/My Contact List/Assets.xcassets/first.imageset/._Contents.json
My Contact List/My Contact List/Assets.xcassets/first.imageset/first.pdf
__MACOSX/My Contact List/My Contact List/Assets.xcassets/first.imageset/._first.pdf
My Contact List/My Contact List/Assets.xcassets/sample-834-bolt.imageset/[email protected]
__MACOSX/My Contact List/My Contact List/Assets.xcassets/sample-834-bolt.imageset/[email protected]
My Contact List/My Contact List/Assets.xcassets/sample-834-bolt.imageset/Contents.json
{ "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "[email protected]", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } }
__MACOSX/My Contact List/My Contact List/Assets.xcassets/sample-834-bolt.imageset/._Contents.json
__MACOSX/My Contact List/My Contact List.xcodeproj/xcuserdata/eierman.xcuserdatad/._xcdebugger
__MACOSX/My Contact List/My Contact List.xcodeproj/xcuserdata/eierman.xcuserdatad/._xcschemes
__MACOSX/My Contact List/My Contact List.xcodeproj/project.xcworkspace/xcuserdata/._eierman.xcuserdatad
My Contact List/My Contact List.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
IDEDidComputeMac32BitWarning
__MACOSX/My Contact List/My Contact List.xcodeproj/project.xcworkspace/xcshareddata/._IDEWorkspaceChecks.plist
My Contact List/.git/objects/51/a3522d1a8251d3583edae3501e30270623b4e9
My Contact List/.git/objects/51/a3522d1a8251d3583edae3501e30270623b4e9
blob 725�// // ContactsViewController.swift // My Contact List // // Created by Michael Eierman on 8/5/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import UIKit class ContactsViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ }
__MACOSX/My Contact List/.git/objects/51/._a3522d1a8251d3583edae3501e30270623b4e9
My Contact List/.git/objects/93/d02855d732ed54e9a873ea163c5b0931fd3b28
My Contact List/.git/objects/93/d02855d732ed54e9a873ea163c5b0931fd3b28
blob 302�<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="14492.1" systemVersion="18G87" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier=""> <elements/> </model>
__MACOSX/My Contact List/.git/objects/93/._d02855d732ed54e9a873ea163c5b0931fd3b28
My Contact List/.git/objects/94/12200eae4ad930a3bda72bb3665ad9b123436f
My Contact List/.git/objects/94/12200eae4ad930a3bda72bb3665ad9b123436f
blob 316�{ "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "[email protected]", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } }
__MACOSX/My Contact List/.git/objects/94/._12200eae4ad930a3bda72bb3665ad9b123436f
My Contact List/.git/objects/b2/85dfbdc51b879e840fc0555565f2e481d6c8fe
My Contact List/.git/objects/b2/85dfbdc51b879e840fc0555565f2e481d6c8fe
blob 715�// // MapViewController.swift // My Contact List // // Created by Michael Eierman on 8/5/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import UIKit class MapViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ }
__MACOSX/My Contact List/.git/objects/b2/._85dfbdc51b879e840fc0555565f2e481d6c8fe
My Contact List/.git/objects/da/4a164c918651cdd1e11dca5cc62c333f097601
My Contact List/.git/objects/da/4a164c918651cdd1e11dca5cc62c333f097601
blob 62�{ "info" : { "version" : 1, "author" : "xcode" } }
__MACOSX/My Contact List/.git/objects/da/._4a164c918651cdd1e11dca5cc62c333f097601
My Contact List/.git/objects/bd/634d80717757250c9b639ee2bb5417c8185c1b
My Contact List/.git/objects/bd/634d80717757250c9b639ee2bb5417c8185c1b
blob 174�// // MapPoint.swift // My Contact List // // Created by Michael Eierman on 8/7/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import Foundation
__MACOSX/My Contact List/.git/objects/bd/._634d80717757250c9b639ee2bb5417c8185c1b
My Contact List/.git/objects/d1/6f0eca20c54005e834e7339cc4838a2c904c46
My Contact List/.git/objects/d1/6f0eca20c54005e834e7339cc4838a2c904c46
blob 725�// // SettingsViewController.swift // My Contact List // // Created by Michael Eierman on 8/5/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import UIKit class SettingsViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ }
__MACOSX/My Contact List/.git/objects/d1/._6f0eca20c54005e834e7339cc4838a2c904c46
My Contact List/.git/objects/c0/aa5890be1fe9b6fcc02f93173455ecf442e757
My Contact List/.git/objects/c0/aa5890be1fe9b6fcc02f93173455ecf442e757
blob 175�// // Constants.swift // My Contact List // // Created by Michael Eierman on 8/6/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import Foundation
__MACOSX/My Contact List/.git/objects/c0/._aa5890be1fe9b6fcc02f93173455ecf442e757
My Contact List/.git/objects/11/12069926cb82235d70c5ca1be944c6f427b2d8
My Contact List/.git/objects/11/12069926cb82235d70c5ca1be944c6f427b2d8
blob 253�{ "images" : [ { "idiom" : "universal", "filename" : "[email protected]", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } }
__MACOSX/My Contact List/.git/objects/11/._12069926cb82235d70c5ca1be944c6f427b2d8
My Contact List/.git/objects/74/bb798c463179d207542c2c0554f5aecf6962d1
My Contact List/.git/objects/74/bb798c463179d207542c2c0554f5aecf6962d1
blob 717�// // DateViewController.swift // My Contact List // // Created by Michael Eierman on 8/6/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import UIKit class DateViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ }
__MACOSX/My Contact List/.git/objects/74/._bb798c463179d207542c2c0554f5aecf6962d1
My Contact List/.git/objects/44/7805c2535443ad8c4487730db74c1667ee6341
My Contact List/.git/objects/44/7805c2535443ad8c4487730db74c1667ee6341
blob 2990�// // ContactsTableViewController.swift // My Contact List // // Created by Michael Eierman on 8/6/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import UIKit class ContactsTableViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() // Uncomment the following line to preserve selection between presentations // self.clearsSelectionOnViewWillAppear = false // Uncomment the following line to display an Edit button in the navigation bar for this view controller. // self.navigationItem.rightBarButtonItem = self.editButtonItem } // MARK: - Table view data source override func numberOfSections(in tableView: UITableView) -> Int { // #warning Incomplete implementation, return the number of sections return 0 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // #warning Incomplete implementation, return the number of rows return 0 } /* override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) // Configure the cell... return cell } */ /* // Override to support conditional editing of the table view. override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { // Return false if you do not want the specified item to be editable. return true } */ /* // Override to support editing the table view. override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { // Delete the row from the data source tableView.deleteRows(at: [indexPath], with: .fade) } else if editingStyle == .insert { // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view } } */ /* // Override to support rearranging the table view. override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { } */ /* // Override to support conditional rearranging of the table view. override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { // Return false if you do not want the item to be re-orderable. return true } */ /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ }
__MACOSX/My Contact List/.git/objects/44/._7805c2535443ad8c4487730db74c1667ee6341
My Contact List/.git/objects/a9/5798642c33b00826cad4dc9c2d9496a639b867
My Contact List/.git/objects/a9/5798642c33b00826cad4dc9c2d9496a639b867
blob 733�// // LocationDemoViewController.swift // My Contact List // // Created by Michael Eierman on 8/6/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved. // import UIKit class LocationDemoViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ }
__MACOSX/My Contact List/.git/objects/a9/._5798642c33b00826cad4dc9c2d9496a639b867
My Contact List/.git/objects/f9/2f7cb6f4a02aaeb2534504bea9569b4983af2a
My Contact List/.git/objects/f9/2f7cb6f4a02aaeb2534504bea9569b4983af2a
blob 315�{ "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "[email protected]", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } }
__MACOSX/My Contact List/.git/objects/f9/._2f7cb6f4a02aaeb2534504bea9569b4983af2a
My Contact List/.git/objects/48/c3d8a19a1cfa5de320310c63de76f8c81a7c34
My Contact List/.git/objects/48/c3d8a19a1cfa5de320310c63de76f8c81a7c34
__MACOSX/My Contact List/.git/objects/48/._c3d8a19a1cfa5de320310c63de76f8c81a7c34
My Contact List/.git/objects/1e/0d01adc6f978d6275e73583222c77d493d5b77
My Contact List/.git/objects/1e/0d01adc6f978d6275e73583222c77d493d5b77
__MACOSX/My Contact List/.git/objects/1e/._0d01adc6f978d6275e73583222c77d493d5b77
My Contact List/.git/objects/78/1aca185052a2d2bf29c3616dd99368c4b7e088
My Contact List/.git/objects/78/1aca185052a2d2bf29c3616dd99368c4b7e088
blob 359�{ "images" : [ { "idiom" : "universal", "filename" : "sample-401-globe.png", "scale" : "1x" }, { "idiom" : "universal", "filename" : "[email protected]", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } }
__MACOSX/My Contact List/.git/objects/78/._1aca185052a2d2bf29c3616dd99368c4b7e088
My Contact List/.git/objects/7f/5e4906c3aee1b2c91fa1f684694edb8d21cc4b
My Contact List/.git/objects/7f/5e4906c3aee1b2c91fa1f684694edb8d21cc4b
__MACOSX/My Contact List/.git/objects/7f/._5e4906c3aee1b2c91fa1f684694edb8d21cc4b
My Contact List/My Contact List.xcodeproj/xcuserdata/fredoseitutu.xcuserdatad/xcschemes/xcschememanagement.plist
SchemeUserState My Contact List.xcscheme_^#shared#^_ orderHint 0
My Contact List/My Contact List.xcodeproj/xcuserdata/eierman.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
__MACOSX/My Contact List/My Contact List.xcodeproj/xcuserdata/eierman.xcuserdatad/xcdebugger/._Breakpoints_v2.xcbkptlist
My Contact List/My Contact List.xcodeproj/xcuserdata/eierman.xcuserdatad/xcschemes/xcschememanagement.plist
SchemeUserState My Contact List.xcscheme_^#shared#^_ orderHint 0