SlideShare a Scribd company logo
1 of 91
Country Economic & Geopolitical Analysis Outline
Country Analysis & Presentation: Assignment is an analysis
detailing economic and geopolitical concerns for your country
(about 6 written pages, about 1900-2500 words, with additional
Works Cited page). Consider paper a ‘macro’ approach to how
your country functions in our ‘Globalized World’.
PSC 100 – Relating to Clark/Sage chapters 5, 6 & 7
PSC 102 – Relating to Art/Jervis political economy & Goldstein
textbook
MLA Format: double spaced, using New Times Roman 12-point
font with one-inch margins. In addition to analysis (1900 words
min.), works cited page using MLA style shall be included.
Cite all references & use intext citations. (Page: 1-inch
margins, 12-point Times New Roman font, & minimal spacing
elements)
The following questions are suggestions for information to
research for country paper to write & develop your analysis.
Do not answer the questions for your paper; following are ideas
to consider what to research.
Think S.W.O.T. - Strengths, Weaknesses, Opportunities,
Threats
Examine the geopolitical realities:
Do geographical barriers protect the country from external
threats? Do the ethnic, religious, cultural, and educational
characteristics effect the country? What is the system of
government & how is political stability of the country?
Look at the government structure: does government allow
vibrant trade or it interfere? Address possible implications of
not being self-sufficient with regards to feeding, educating &
employing its citizens. Is the militarily vulnerable? Is
economy diverse? Is the country economically powerful? Is the
country a member of regional economic organizations? How
stable is the country & the region they are in? What are the
destabilizing forces? Are their tensions between major actors?
Examine the economic realities:
Is this a developed or developing nation? Look at agricultural
& manufacturing sectors and the country’s natural resources.
Does infrastructure accommodate economic activity (I.E. ports,
rails, rivers, universities)? What are the major exports and
imports (for describing trade flows - who they trade with)? Is
work force skilled/unskilled & professional? Look at economic
and trade indicators such as per capita GDP, exports and
imports as a percentage of GDP, etc.
Analysis:
Taking into account the information described above, describe
the country’s economic & political aspects, strengths and
weaknesses of country, and address any challenges or potential
liabilities posed by internal or external threats.
Address the country’s future as your research develops. What
does country need to do to prosper & develop? Identify the
pitfalls to be avoided. Does the future hold peace & stability or
conflict? Again Think S.W.O.T.
Sources:
Works Cited page needs minimum 7 sources from high level
sources, including 3 peer reviewed academic articles from ‘UT
data base’ (check search boxes for peer review & full text).
Examples of data bases: Academic One File/GALE, Business
Source Complete/Premier, Europa, ProQuest, Columbia
International Affairs, and Academic Search Premier/EBSCO).
Use intext citations.
Check UT Library site for Country Studies & Intercultural
Communication: Start on Library Main Page (use My UT to
access library). Scroll down to Research Guides (click box) at
bottom of page. Scroll down about 1/3 to Country Studies &
Intercultural Communication (click), see on left, ‘Country
Reports & Peer Reviewed Articles’, and on right search for
‘articles in the library data bases’ – go to Business Source
Complete, see Country Reports.
Possible additional sources: Center for Strategic & International
Studies, Council on Foreign Relations, World Bank, CIA World
Factbook, Freedom House, and United Nations. Country
Reports are helpful; remember they are country reports, not
academic journals.
Additional sources after min. 7: Global Road Warrior may help
picking a country. Newspapers and .com sites are not academic.
If using newspapers, it must over the 7 min. Avoid
encyclopedias. Use college level material. Note the difference
between peer reviewed article in a journal versus a report (too
much data, not enough analysis) and newspapers (snapshot of
the moment - may get some context but no depth). Plagiarism
will earn you a failing grade.
For Country News Discussion, use Nexus Uni or Reuters or
BBC under International News – Country Studies &
Intercultural Communication.
Pro_Lab 12
1. Add a control to allow the user to change the accuracy setting
for the sensor, and notice how the output changes when moving
about using different settings.
2. The app now has database access code in several view
controllers. To support a cleaner design, add a database access
class that controls all access to Core Data and provides useful
methods and properties to the rest of the app.
3. Turn off the user’s permission to access location for the App
(in the Simulator, go to Settings > Privacy > Location). Run the
app again and observe what happens. Is this appropriate
behavior? How could it be improved?
4. What would happen if the code in Listing 13.10 was placed in
viewDidLoad instead of viewWillAppear? (Check
MapPoint.swift)
5. Change the text displayed on the pin to include the City for
the contact.
6. Change the cell layout to use the other two styles.
7. Expand the settings screen to allow for specifying two sort
fields. Then have the sorting be done by first one and then the
other field.
8. Choose different fields from the Contact class to display in
the table.
9. Change the display in the table to look like this instead: Main
label: Superman from Metropolis. Detail Label: Born on: April
18, 1938.
10. Change the app so when the user taps the + button to add a
new Contact, the Contact screen is put into edit mode and the
cursor placed in the first text field.
__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: "%gu{00B0}",
coordinate.latitude)
lblLongitude.text = String(format: "%gu{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: "%gu{00B0}",
coordinate.longitude)
lblLatitude.text = String(format: "%gu{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: "%gu{00B0} (%@)",
theHeading, direction)
lblHeadingAccuracy.text = String(format:
"%gu{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(notificatio
n:)), name:
UIResponder.keyboardDidShowNotification, object:
nil)
NotificationCenter.default.addObserver(self, selector:
#selector(ContactsViewController.keyboardWillHide(notificatio
n:)), 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 customi zation 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.persisten tContainer.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_CONVERSIO
N = 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_IMPLEMENTATI
ONS = 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_CONVERSIO
N = 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_IMPLEMENTATI
ONS = 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.x
cdatamodel/contents
__MACOSX/My Contact List/My Contact
List/MyContactListModel.xcdatamodeld/MyContactListModel.x
cdatamodel/._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.xcuse
rdatad
My Contact List/My Contact
List.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspac
eChecks.plist
IDEDidComputeMac32BitWarning
__MACOSX/My Contact List/My Contact
List.xcodeproj/project.xcworkspace/xcshareddata/._IDEWorksp
aceChecks.plist
My Contact
List/.git/objects/51/a3522d1a8251d3583edae3501e302706 23b4e
9
My Contact
List/.git/objects/51/a3522d1a8251d3583edae3501e30270623b4e
9
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/._a3522d1a8251d3583edae3501e30270623b
4e9
My Contact
List/.git/objects/93/d02855d732ed54e9a873ea163c5b0931fd3b2
8
My Contact
List/.git/objects/93/d02855d732ed54e9a873ea163c5b0931fd3b2
8
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/._d02855d732ed54e9a873ea163c5b0931fd3b
28
My Contact
List/.git/objects/94/12200eae4ad930a3bda72bb3665ad9b123436
f
My Contact
List/.git/objects/94/12200eae4ad930a3bda72bb3665ad9b123436
f
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/._12200eae4ad930a3bda72bb3665ad9b1234
36f
My Contact
List/.git/objects/b2/85dfbdc51b879e840fc0555565f2e481d6c8 fe
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/._85dfbdc51b879e840fc0555565f2e481d6c8
fe
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/._4a164c918651cdd1e11dca5cc62c333f0976
01
My Contact
List/.git/objects/bd/634d80717757250c9b639ee2bb5417c8185c1
b
My Contact
List/.git/objects/bd/634d80717757250c9b639ee2bb5417c8185c1
b
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/._634d80717757250c9b639ee2bb5417c8185
c1b
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/._6f0eca20c54005e834e7339cc4838a2c904c
46
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/._aa5890be1fe9b6fcc02f93173455ecf442e75
7
My Contact
List/.git/objects/11/12069926cb82235d70c5ca1be944c6f427b2d
8
My Contact
List/.git/objects/11/12069926cb82235d70c5ca1be944c6f427b2d
8
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/._12069926cb82235d70c5ca1be944c6f427b2
d8
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/._bb798c463179d207542c2c0554f5aecf6962
d1
My Contact
List/.git/objects/44/7805c2535443ad8c4487730db74c1667ee634
1
My Contact
List/.git/objects/44/7805c2535443ad8c4487730db74c1667ee634
1
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/._7805c2535443ad8c4487730db74c1667ee6
341
My Contact
List/.git/objects/a9/5798642c33b00826cad4dc9c2d949 6a639b86
7
My Contact
List/.git/objects/a9/5798642c33b00826cad4dc9c2d9496a639b86
7
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/._5798642c33b00826cad4dc9c2d9496a639b
867
My Contact
List/.git/objects/f9/2f7cb6f4a02aaeb2534504bea9569b4983af2a
My Contact
List/.git/objects/f9/2f7cb6f4a02aae b2534504bea9569b4983af2a
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/._2f7cb6f4a02aaeb2534504bea9569b4983af2
a
My Contact
List/.git/objects/48/c3d8a19a1cfa5de320310c63de76f8c81a7c34
My Contact
List/.git/objects/48/c3d8a19a1cfa5de320310c63de76f8c81a7c34
__MACOSX/My Contact
List/.git/objects/48/._c3d8a19a1cfa5de320310c63de76f8c81a7c
34
My Contact
List/.git/objects/1e/0d01adc6f978d6275e73583222c77d493d5b7
7
My Contact
List/.git/objects/1e/0d01adc6f978d6275e73583222c77d493d5b7
7
__MACOSX/My Contact
List/.git/objects/1e/._0d01adc6f978d6275e73583222c77d493d5b
77
My Contact
List/.git/objects/78/1aca185052a2d2bf29c3616dd99368c4b7e08
8
My Contact
List/.git/objects/78/1aca185052a2d2bf29c3616dd99368c4b7e08
8
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/._1aca185052a2d2bf29c3616dd99368c4b7e0
88
My Contact
List/.git/objects/7f/5e4906c3aee1b2c91fa1f684694edb8d21cc4b
My Contact
List/.git/objects/7f/5e4906c3aee1b2c91fa1f684694edb8d21cc4b
__MACOSX/My Contact
List/.git/objects/7f/._5e4906c3aee1b2c91fa1f684694edb8d21cc4
b
My Contact List/My Contact
List.xcodeproj/xcuserdata/fredoseitutu.xcuserdatad/xcschemes/x
cschememanagement.plist
SchemeUserState
My Contact List.xcscheme_^#shared#^_
orderHint
0
My Contact List/My Contact
List.xcodeproj/xcuserdata/eierman.xcuserdatad/xcdebugger/Brea
kpoints_v2.xcbkptlist
__MACOSX/My Contact List/My Contact
List.xcodeproj/xcuserdata/eierman.xcuserdatad/xcdebugger/._Br
eakpoints_v2.xcbkptlist
My Contact List/My Contact
List.xcodeproj/xcuserdata/eierman.xcuserdatad/xcschemes/xcsc
hememanagement.plist
SchemeUserState
My Contact List.xcscheme_^#shared#^_
orderHint
0
__MACOSX/My Contact List/My Contact
List.xcodeproj/xcuserdata/eierman.xcuserdatad/xcschemes/._xcs
chememanagement.plist
My Contact List/My Contact
List.xcodeproj/project.xcworkspace/xcuserdata/fredoseitutu.xcu
serdatad/UserInterfaceState.xcuserstate
My Contact List/My Contact
List.xcodeproj/project.xcworkspace/xcuserdata/eierman.xcuserd
atad/.dat.nosync01d8.b0Tmr0
__MACOSX/My Contact List/My Contact
List.xcodeproj/project.xcworkspace/xcuserdata/eierman.xcuserd
atad/._.dat.nosync01d8.b0Tmr0
My Contact List/My Contact
List.xcodeproj/project.xcworkspace/xcuserdata/eierman.xcuserd
atad/UserInterfaceState.xcuserstate
__MACOSX/My Contact List/My Contact
List.xcodeproj/project.xcworkspace/xcuserdata/eierman.xcuserd
atad/._UserInterfaceState.xcuserstate

More Related Content

Similar to Country Economic & Geopolitical Analysis OutlineCountry Analys

ECO-111 MACROECONOMICSWRITTEN ASSIGNMENT 4 QUESTIONS1
ECO-111 MACROECONOMICSWRITTEN ASSIGNMENT 4 QUESTIONS1ECO-111 MACROECONOMICSWRITTEN ASSIGNMENT 4 QUESTIONS1
ECO-111 MACROECONOMICSWRITTEN ASSIGNMENT 4 QUESTIONS1EvonCanales257
 
Eco 111 macroeconomicswritten assignment 4 questions1
Eco 111 macroeconomicswritten assignment 4 questions1Eco 111 macroeconomicswritten assignment 4 questions1
Eco 111 macroeconomicswritten assignment 4 questions1joney4
 
1- the city that you need to write about.Chicago, ILIndica.docx
1- the city that you need to write about.Chicago, ILIndica.docx1- the city that you need to write about.Chicago, ILIndica.docx
1- the city that you need to write about.Chicago, ILIndica.docxjeremylockett77
 
DATA EXERCISE #1Format of the ProjectThe Data Exercise must b.docx
DATA EXERCISE #1Format of the ProjectThe Data Exercise must b.docxDATA EXERCISE #1Format of the ProjectThe Data Exercise must b.docx
DATA EXERCISE #1Format of the ProjectThe Data Exercise must b.docxwhittemorelucilla
 
1 University of Houston Victoria .docx
 1 University of Houston Victoria                       .docx 1 University of Houston Victoria                       .docx
1 University of Houston Victoria .docxaryan532920
 
We need Paper on Risk Assessment for the organization (NASA). Th.docx
We need Paper on Risk Assessment for the organization (NASA). Th.docxWe need Paper on Risk Assessment for the organization (NASA). Th.docx
We need Paper on Risk Assessment for the organization (NASA). Th.docxcelenarouzie
 
ASSIGNMENT #6POLS 365IDENTIFYING VARIABLES AND PROPOSING HYP.docx
ASSIGNMENT #6POLS 365IDENTIFYING VARIABLES AND PROPOSING HYP.docxASSIGNMENT #6POLS 365IDENTIFYING VARIABLES AND PROPOSING HYP.docx
ASSIGNMENT #6POLS 365IDENTIFYING VARIABLES AND PROPOSING HYP.docxjane3dyson92312
 
You are to select a multinational corporation - examples include P.docx
You are to select a multinational corporation - examples include P.docxYou are to select a multinational corporation - examples include P.docx
You are to select a multinational corporation - examples include P.docxkenjordan97598
 
Page 1 of 2 Project Constructing a Three-Stock Optimal.docx
Page 1 of 2  Project Constructing a Three-Stock Optimal.docxPage 1 of 2  Project Constructing a Three-Stock Optimal.docx
Page 1 of 2 Project Constructing a Three-Stock Optimal.docxalfred4lewis58146
 
Social Ch 13 Questions
Social Ch 13 QuestionsSocial Ch 13 Questions
Social Ch 13 Questionsgueste1a6a6
 
LedgerLEDGERACCOUNTACC. NO. 1100BalanceDateItemRefDebitCreditDebit.docx
LedgerLEDGERACCOUNTACC. NO. 1100BalanceDateItemRefDebitCreditDebit.docxLedgerLEDGERACCOUNTACC. NO. 1100BalanceDateItemRefDebitCreditDebit.docx
LedgerLEDGERACCOUNTACC. NO. 1100BalanceDateItemRefDebitCreditDebit.docxSHIVA101531
 
International Investing ProjectThis project allows.docx
            International Investing ProjectThis project allows.docx            International Investing ProjectThis project allows.docx
International Investing ProjectThis project allows.docxhallettfaustina
 
Analyst Report – 125 points(This assignment is to be completed.docx
Analyst Report – 125 points(This assignment is to be completed.docxAnalyst Report – 125 points(This assignment is to be completed.docx
Analyst Report – 125 points(This assignment is to be completed.docxrossskuddershamus
 

Similar to Country Economic & Geopolitical Analysis OutlineCountry Analys (14)

ECO-111 MACROECONOMICSWRITTEN ASSIGNMENT 4 QUESTIONS1
ECO-111 MACROECONOMICSWRITTEN ASSIGNMENT 4 QUESTIONS1ECO-111 MACROECONOMICSWRITTEN ASSIGNMENT 4 QUESTIONS1
ECO-111 MACROECONOMICSWRITTEN ASSIGNMENT 4 QUESTIONS1
 
Eco 111 macroeconomicswritten assignment 4 questions1
Eco 111 macroeconomicswritten assignment 4 questions1Eco 111 macroeconomicswritten assignment 4 questions1
Eco 111 macroeconomicswritten assignment 4 questions1
 
1- the city that you need to write about.Chicago, ILIndica.docx
1- the city that you need to write about.Chicago, ILIndica.docx1- the city that you need to write about.Chicago, ILIndica.docx
1- the city that you need to write about.Chicago, ILIndica.docx
 
DATA EXERCISE #1Format of the ProjectThe Data Exercise must b.docx
DATA EXERCISE #1Format of the ProjectThe Data Exercise must b.docxDATA EXERCISE #1Format of the ProjectThe Data Exercise must b.docx
DATA EXERCISE #1Format of the ProjectThe Data Exercise must b.docx
 
1 University of Houston Victoria .docx
 1 University of Houston Victoria                       .docx 1 University of Houston Victoria                       .docx
1 University of Houston Victoria .docx
 
We need Paper on Risk Assessment for the organization (NASA). Th.docx
We need Paper on Risk Assessment for the organization (NASA). Th.docxWe need Paper on Risk Assessment for the organization (NASA). Th.docx
We need Paper on Risk Assessment for the organization (NASA). Th.docx
 
ASSIGNMENT #6POLS 365IDENTIFYING VARIABLES AND PROPOSING HYP.docx
ASSIGNMENT #6POLS 365IDENTIFYING VARIABLES AND PROPOSING HYP.docxASSIGNMENT #6POLS 365IDENTIFYING VARIABLES AND PROPOSING HYP.docx
ASSIGNMENT #6POLS 365IDENTIFYING VARIABLES AND PROPOSING HYP.docx
 
You are to select a multinational corporation - examples include P.docx
You are to select a multinational corporation - examples include P.docxYou are to select a multinational corporation - examples include P.docx
You are to select a multinational corporation - examples include P.docx
 
Page 1 of 2 Project Constructing a Three-Stock Optimal.docx
Page 1 of 2  Project Constructing a Three-Stock Optimal.docxPage 1 of 2  Project Constructing a Three-Stock Optimal.docx
Page 1 of 2 Project Constructing a Three-Stock Optimal.docx
 
Social Ch 13 Questions
Social Ch 13 QuestionsSocial Ch 13 Questions
Social Ch 13 Questions
 
LedgerLEDGERACCOUNTACC. NO. 1100BalanceDateItemRefDebitCreditDebit.docx
LedgerLEDGERACCOUNTACC. NO. 1100BalanceDateItemRefDebitCreditDebit.docxLedgerLEDGERACCOUNTACC. NO. 1100BalanceDateItemRefDebitCreditDebit.docx
LedgerLEDGERACCOUNTACC. NO. 1100BalanceDateItemRefDebitCreditDebit.docx
 
International Investing ProjectThis project allows.docx
            International Investing ProjectThis project allows.docx            International Investing ProjectThis project allows.docx
International Investing ProjectThis project allows.docx
 
Analyst Report – 125 points(This assignment is to be completed.docx
Analyst Report – 125 points(This assignment is to be completed.docxAnalyst Report – 125 points(This assignment is to be completed.docx
Analyst Report – 125 points(This assignment is to be completed.docx
 
DSD
DSDDSD
DSD
 

More from CruzIbarra161

Business and Government Relations  Please respond to the following.docx
Business and Government Relations  Please respond to the following.docxBusiness and Government Relations  Please respond to the following.docx
Business and Government Relations  Please respond to the following.docxCruzIbarra161
 
Business Continuity Planning Explain how components of the busine.docx
Business Continuity Planning Explain how components of the busine.docxBusiness Continuity Planning Explain how components of the busine.docx
Business Continuity Planning Explain how components of the busine.docxCruzIbarra161
 
business and its environment Discuss the genesis, contributing fac.docx
business and its environment Discuss the genesis, contributing fac.docxbusiness and its environment Discuss the genesis, contributing fac.docx
business and its environment Discuss the genesis, contributing fac.docxCruzIbarra161
 
business and its environment Discuss the genesis, contributing facto.docx
business and its environment Discuss the genesis, contributing facto.docxbusiness and its environment Discuss the genesis, contributing facto.docx
business and its environment Discuss the genesis, contributing facto.docxCruzIbarra161
 
Business BUS 210 research outline1.Cover page 2.Table .docx
Business BUS 210 research outline1.Cover page 2.Table .docxBusiness BUS 210 research outline1.Cover page 2.Table .docx
Business BUS 210 research outline1.Cover page 2.Table .docxCruzIbarra161
 
BUS 439 International Human Resource ManagementInstructor Steven .docx
BUS 439 International Human Resource ManagementInstructor Steven .docxBUS 439 International Human Resource ManagementInstructor Steven .docx
BUS 439 International Human Resource ManagementInstructor Steven .docxCruzIbarra161
 
BUS 439 International Human Resource ManagementEmployee Value Pr.docx
BUS 439 International Human Resource ManagementEmployee Value Pr.docxBUS 439 International Human Resource ManagementEmployee Value Pr.docx
BUS 439 International Human Resource ManagementEmployee Value Pr.docxCruzIbarra161
 
Bullzeye is a discount retailer offering a wide range of products,.docx
Bullzeye is a discount retailer offering a wide range of products,.docxBullzeye is a discount retailer offering a wide range of products,.docx
Bullzeye is a discount retailer offering a wide range of products,.docxCruzIbarra161
 
Building on the work that you prepared for Milestones One through Th.docx
Building on the work that you prepared for Milestones One through Th.docxBuilding on the work that you prepared for Milestones One through Th.docx
Building on the work that you prepared for Milestones One through Th.docxCruzIbarra161
 
Budget Legislation Once the budget has been prepared by the vari.docx
Budget Legislation Once the budget has been prepared by the vari.docxBudget Legislation Once the budget has been prepared by the vari.docx
Budget Legislation Once the budget has been prepared by the vari.docxCruzIbarra161
 
Browsing the podcasts on iTunes or YouTube, listen to a few of Gramm.docx
Browsing the podcasts on iTunes or YouTube, listen to a few of Gramm.docxBrowsing the podcasts on iTunes or YouTube, listen to a few of Gramm.docx
Browsing the podcasts on iTunes or YouTube, listen to a few of Gramm.docxCruzIbarra161
 
Brown Primary Care Dental clinics Oral Health Initiative p.docx
Brown Primary Care Dental clinics Oral Health Initiative p.docxBrown Primary Care Dental clinics Oral Health Initiative p.docx
Brown Primary Care Dental clinics Oral Health Initiative p.docxCruzIbarra161
 
BUDDHISMWEEK 3Cosmogony - Origin of the UniverseNature of .docx
BUDDHISMWEEK 3Cosmogony - Origin of the UniverseNature of .docxBUDDHISMWEEK 3Cosmogony - Origin of the UniverseNature of .docx
BUDDHISMWEEK 3Cosmogony - Origin of the UniverseNature of .docxCruzIbarra161
 
Build a binary search tree that holds first names.Create a menu .docx
Build a binary search tree that holds first names.Create a menu .docxBuild a binary search tree that holds first names.Create a menu .docx
Build a binary search tree that holds first names.Create a menu .docxCruzIbarra161
 
Briefly describe the development of the string quartet. How would yo.docx
Briefly describe the development of the string quartet. How would yo.docxBriefly describe the development of the string quartet. How would yo.docx
Briefly describe the development of the string quartet. How would yo.docxCruzIbarra161
 
Briefly describe a time when you were misled by everyday observation.docx
Briefly describe a time when you were misled by everyday observation.docxBriefly describe a time when you were misled by everyday observation.docx
Briefly describe a time when you were misled by everyday observation.docxCruzIbarra161
 
Broadening Your Perspective 8-1The financial statements of Toots.docx
Broadening Your Perspective 8-1The financial statements of Toots.docxBroadening Your Perspective 8-1The financial statements of Toots.docx
Broadening Your Perspective 8-1The financial statements of Toots.docxCruzIbarra161
 
Briefly discuss the differences in the old Minimum Foundation Prog.docx
Briefly discuss the differences in the old Minimum Foundation Prog.docxBriefly discuss the differences in the old Minimum Foundation Prog.docx
Briefly discuss the differences in the old Minimum Foundation Prog.docxCruzIbarra161
 
Briefly compare and contrast EHRs, EMRs, and PHRs. Include the typic.docx
Briefly compare and contrast EHRs, EMRs, and PHRs. Include the typic.docxBriefly compare and contrast EHRs, EMRs, and PHRs. Include the typic.docx
Briefly compare and contrast EHRs, EMRs, and PHRs. Include the typic.docxCruzIbarra161
 
Brief Exercise 9-11Suppose Nike, Inc. reported the followin.docx
Brief Exercise 9-11Suppose Nike, Inc. reported the followin.docxBrief Exercise 9-11Suppose Nike, Inc. reported the followin.docx
Brief Exercise 9-11Suppose Nike, Inc. reported the followin.docxCruzIbarra161
 

More from CruzIbarra161 (20)

Business and Government Relations  Please respond to the following.docx
Business and Government Relations  Please respond to the following.docxBusiness and Government Relations  Please respond to the following.docx
Business and Government Relations  Please respond to the following.docx
 
Business Continuity Planning Explain how components of the busine.docx
Business Continuity Planning Explain how components of the busine.docxBusiness Continuity Planning Explain how components of the busine.docx
Business Continuity Planning Explain how components of the busine.docx
 
business and its environment Discuss the genesis, contributing fac.docx
business and its environment Discuss the genesis, contributing fac.docxbusiness and its environment Discuss the genesis, contributing fac.docx
business and its environment Discuss the genesis, contributing fac.docx
 
business and its environment Discuss the genesis, contributing facto.docx
business and its environment Discuss the genesis, contributing facto.docxbusiness and its environment Discuss the genesis, contributing facto.docx
business and its environment Discuss the genesis, contributing facto.docx
 
Business BUS 210 research outline1.Cover page 2.Table .docx
Business BUS 210 research outline1.Cover page 2.Table .docxBusiness BUS 210 research outline1.Cover page 2.Table .docx
Business BUS 210 research outline1.Cover page 2.Table .docx
 
BUS 439 International Human Resource ManagementInstructor Steven .docx
BUS 439 International Human Resource ManagementInstructor Steven .docxBUS 439 International Human Resource ManagementInstructor Steven .docx
BUS 439 International Human Resource ManagementInstructor Steven .docx
 
BUS 439 International Human Resource ManagementEmployee Value Pr.docx
BUS 439 International Human Resource ManagementEmployee Value Pr.docxBUS 439 International Human Resource ManagementEmployee Value Pr.docx
BUS 439 International Human Resource ManagementEmployee Value Pr.docx
 
Bullzeye is a discount retailer offering a wide range of products,.docx
Bullzeye is a discount retailer offering a wide range of products,.docxBullzeye is a discount retailer offering a wide range of products,.docx
Bullzeye is a discount retailer offering a wide range of products,.docx
 
Building on the work that you prepared for Milestones One through Th.docx
Building on the work that you prepared for Milestones One through Th.docxBuilding on the work that you prepared for Milestones One through Th.docx
Building on the work that you prepared for Milestones One through Th.docx
 
Budget Legislation Once the budget has been prepared by the vari.docx
Budget Legislation Once the budget has been prepared by the vari.docxBudget Legislation Once the budget has been prepared by the vari.docx
Budget Legislation Once the budget has been prepared by the vari.docx
 
Browsing the podcasts on iTunes or YouTube, listen to a few of Gramm.docx
Browsing the podcasts on iTunes or YouTube, listen to a few of Gramm.docxBrowsing the podcasts on iTunes or YouTube, listen to a few of Gramm.docx
Browsing the podcasts on iTunes or YouTube, listen to a few of Gramm.docx
 
Brown Primary Care Dental clinics Oral Health Initiative p.docx
Brown Primary Care Dental clinics Oral Health Initiative p.docxBrown Primary Care Dental clinics Oral Health Initiative p.docx
Brown Primary Care Dental clinics Oral Health Initiative p.docx
 
BUDDHISMWEEK 3Cosmogony - Origin of the UniverseNature of .docx
BUDDHISMWEEK 3Cosmogony - Origin of the UniverseNature of .docxBUDDHISMWEEK 3Cosmogony - Origin of the UniverseNature of .docx
BUDDHISMWEEK 3Cosmogony - Origin of the UniverseNature of .docx
 
Build a binary search tree that holds first names.Create a menu .docx
Build a binary search tree that holds first names.Create a menu .docxBuild a binary search tree that holds first names.Create a menu .docx
Build a binary search tree that holds first names.Create a menu .docx
 
Briefly describe the development of the string quartet. How would yo.docx
Briefly describe the development of the string quartet. How would yo.docxBriefly describe the development of the string quartet. How would yo.docx
Briefly describe the development of the string quartet. How would yo.docx
 
Briefly describe a time when you were misled by everyday observation.docx
Briefly describe a time when you were misled by everyday observation.docxBriefly describe a time when you were misled by everyday observation.docx
Briefly describe a time when you were misled by everyday observation.docx
 
Broadening Your Perspective 8-1The financial statements of Toots.docx
Broadening Your Perspective 8-1The financial statements of Toots.docxBroadening Your Perspective 8-1The financial statements of Toots.docx
Broadening Your Perspective 8-1The financial statements of Toots.docx
 
Briefly discuss the differences in the old Minimum Foundation Prog.docx
Briefly discuss the differences in the old Minimum Foundation Prog.docxBriefly discuss the differences in the old Minimum Foundation Prog.docx
Briefly discuss the differences in the old Minimum Foundation Prog.docx
 
Briefly compare and contrast EHRs, EMRs, and PHRs. Include the typic.docx
Briefly compare and contrast EHRs, EMRs, and PHRs. Include the typic.docxBriefly compare and contrast EHRs, EMRs, and PHRs. Include the typic.docx
Briefly compare and contrast EHRs, EMRs, and PHRs. Include the typic.docx
 
Brief Exercise 9-11Suppose Nike, Inc. reported the followin.docx
Brief Exercise 9-11Suppose Nike, Inc. reported the followin.docxBrief Exercise 9-11Suppose Nike, Inc. reported the followin.docx
Brief Exercise 9-11Suppose Nike, Inc. reported the followin.docx
 

Recently uploaded

Organic Name Reactions for the students and aspirants of Chemistry12th.pptx
Organic Name Reactions  for the students and aspirants of Chemistry12th.pptxOrganic Name Reactions  for the students and aspirants of Chemistry12th.pptx
Organic Name Reactions for the students and aspirants of Chemistry12th.pptxVS Mahajan Coaching Centre
 
PSYCHIATRIC History collection FORMAT.pptx
PSYCHIATRIC   History collection FORMAT.pptxPSYCHIATRIC   History collection FORMAT.pptx
PSYCHIATRIC History collection FORMAT.pptxPoojaSen20
 
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxSOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxiammrhaywood
 
Concept of Vouching. B.Com(Hons) /B.Compdf
Concept of Vouching. B.Com(Hons) /B.CompdfConcept of Vouching. B.Com(Hons) /B.Compdf
Concept of Vouching. B.Com(Hons) /B.CompdfUmakantAnnand
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityGeoBlogs
 
_Math 4-Q4 Week 5.pptx Steps in Collecting Data
_Math 4-Q4 Week 5.pptx Steps in Collecting Data_Math 4-Q4 Week 5.pptx Steps in Collecting Data
_Math 4-Q4 Week 5.pptx Steps in Collecting DataJhengPantaleon
 
The basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptxThe basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptxheathfieldcps1
 
mini mental status format.docx
mini    mental       status     format.docxmini    mental       status     format.docx
mini mental status format.docxPoojaSen20
 
How to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxHow to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxmanuelaromero2013
 
The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13Steve Thomason
 
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdfssuser54595a
 
Arihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfArihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfchloefrazer622
 
Hybridoma Technology ( Production , Purification , and Application )
Hybridoma Technology  ( Production , Purification , and Application  ) Hybridoma Technology  ( Production , Purification , and Application  )
Hybridoma Technology ( Production , Purification , and Application ) Sakshi Ghasle
 
Employee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptxEmployee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptxNirmalaLoungPoorunde1
 
Introduction to ArtificiaI Intelligence in Higher Education
Introduction to ArtificiaI Intelligence in Higher EducationIntroduction to ArtificiaI Intelligence in Higher Education
Introduction to ArtificiaI Intelligence in Higher Educationpboyjonauth
 
Alper Gobel In Media Res Media Component
Alper Gobel In Media Res Media ComponentAlper Gobel In Media Res Media Component
Alper Gobel In Media Res Media ComponentInMediaRes1
 
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Sapana Sha
 
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17Incoming and Outgoing Shipments in 1 STEP Using Odoo 17
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17Celine George
 
Crayon Activity Handout For the Crayon A
Crayon Activity Handout For the Crayon ACrayon Activity Handout For the Crayon A
Crayon Activity Handout For the Crayon AUnboundStockton
 

Recently uploaded (20)

Organic Name Reactions for the students and aspirants of Chemistry12th.pptx
Organic Name Reactions  for the students and aspirants of Chemistry12th.pptxOrganic Name Reactions  for the students and aspirants of Chemistry12th.pptx
Organic Name Reactions for the students and aspirants of Chemistry12th.pptx
 
PSYCHIATRIC History collection FORMAT.pptx
PSYCHIATRIC   History collection FORMAT.pptxPSYCHIATRIC   History collection FORMAT.pptx
PSYCHIATRIC History collection FORMAT.pptx
 
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxSOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
 
Concept of Vouching. B.Com(Hons) /B.Compdf
Concept of Vouching. B.Com(Hons) /B.CompdfConcept of Vouching. B.Com(Hons) /B.Compdf
Concept of Vouching. B.Com(Hons) /B.Compdf
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activity
 
_Math 4-Q4 Week 5.pptx Steps in Collecting Data
_Math 4-Q4 Week 5.pptx Steps in Collecting Data_Math 4-Q4 Week 5.pptx Steps in Collecting Data
_Math 4-Q4 Week 5.pptx Steps in Collecting Data
 
The basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptxThe basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptx
 
mini mental status format.docx
mini    mental       status     format.docxmini    mental       status     format.docx
mini mental status format.docx
 
How to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxHow to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptx
 
The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13
 
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
 
Arihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfArihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdf
 
Hybridoma Technology ( Production , Purification , and Application )
Hybridoma Technology  ( Production , Purification , and Application  ) Hybridoma Technology  ( Production , Purification , and Application  )
Hybridoma Technology ( Production , Purification , and Application )
 
Employee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptxEmployee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptx
 
Introduction to ArtificiaI Intelligence in Higher Education
Introduction to ArtificiaI Intelligence in Higher EducationIntroduction to ArtificiaI Intelligence in Higher Education
Introduction to ArtificiaI Intelligence in Higher Education
 
Alper Gobel In Media Res Media Component
Alper Gobel In Media Res Media ComponentAlper Gobel In Media Res Media Component
Alper Gobel In Media Res Media Component
 
TataKelola dan KamSiber Kecerdasan Buatan v022.pdf
TataKelola dan KamSiber Kecerdasan Buatan v022.pdfTataKelola dan KamSiber Kecerdasan Buatan v022.pdf
TataKelola dan KamSiber Kecerdasan Buatan v022.pdf
 
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
 
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17Incoming and Outgoing Shipments in 1 STEP Using Odoo 17
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17
 
Crayon Activity Handout For the Crayon A
Crayon Activity Handout For the Crayon ACrayon Activity Handout For the Crayon A
Crayon Activity Handout For the Crayon A
 

Country Economic & Geopolitical Analysis OutlineCountry Analys

  • 1. Country Economic & Geopolitical Analysis Outline Country Analysis & Presentation: Assignment is an analysis detailing economic and geopolitical concerns for your country (about 6 written pages, about 1900-2500 words, with additional Works Cited page). Consider paper a ‘macro’ approach to how your country functions in our ‘Globalized World’. PSC 100 – Relating to Clark/Sage chapters 5, 6 & 7 PSC 102 – Relating to Art/Jervis political economy & Goldstein textbook MLA Format: double spaced, using New Times Roman 12-point font with one-inch margins. In addition to analysis (1900 words min.), works cited page using MLA style shall be included. Cite all references & use intext citations. (Page: 1-inch margins, 12-point Times New Roman font, & minimal spacing elements) The following questions are suggestions for information to research for country paper to write & develop your analysis. Do not answer the questions for your paper; following are ideas to consider what to research. Think S.W.O.T. - Strengths, Weaknesses, Opportunities, Threats Examine the geopolitical realities: Do geographical barriers protect the country from external threats? Do the ethnic, religious, cultural, and educational characteristics effect the country? What is the system of government & how is political stability of the country? Look at the government structure: does government allow
  • 2. vibrant trade or it interfere? Address possible implications of not being self-sufficient with regards to feeding, educating & employing its citizens. Is the militarily vulnerable? Is economy diverse? Is the country economically powerful? Is the country a member of regional economic organizations? How stable is the country & the region they are in? What are the destabilizing forces? Are their tensions between major actors? Examine the economic realities: Is this a developed or developing nation? Look at agricultural & manufacturing sectors and the country’s natural resources. Does infrastructure accommodate economic activity (I.E. ports, rails, rivers, universities)? What are the major exports and imports (for describing trade flows - who they trade with)? Is work force skilled/unskilled & professional? Look at economic and trade indicators such as per capita GDP, exports and imports as a percentage of GDP, etc. Analysis: Taking into account the information described above, describe the country’s economic & political aspects, strengths and weaknesses of country, and address any challenges or potential liabilities posed by internal or external threats. Address the country’s future as your research develops. What does country need to do to prosper & develop? Identify the pitfalls to be avoided. Does the future hold peace & stability or conflict? Again Think S.W.O.T. Sources: Works Cited page needs minimum 7 sources from high level sources, including 3 peer reviewed academic articles from ‘UT data base’ (check search boxes for peer review & full text). Examples of data bases: Academic One File/GALE, Business Source Complete/Premier, Europa, ProQuest, Columbia International Affairs, and Academic Search Premier/EBSCO).
  • 3. Use intext citations. Check UT Library site for Country Studies & Intercultural Communication: Start on Library Main Page (use My UT to access library). Scroll down to Research Guides (click box) at bottom of page. Scroll down about 1/3 to Country Studies & Intercultural Communication (click), see on left, ‘Country Reports & Peer Reviewed Articles’, and on right search for ‘articles in the library data bases’ – go to Business Source Complete, see Country Reports. Possible additional sources: Center for Strategic & International Studies, Council on Foreign Relations, World Bank, CIA World Factbook, Freedom House, and United Nations. Country Reports are helpful; remember they are country reports, not academic journals. Additional sources after min. 7: Global Road Warrior may help picking a country. Newspapers and .com sites are not academic. If using newspapers, it must over the 7 min. Avoid encyclopedias. Use college level material. Note the difference between peer reviewed article in a journal versus a report (too much data, not enough analysis) and newspapers (snapshot of the moment - may get some context but no depth). Plagiarism will earn you a failing grade. For Country News Discussion, use Nexus Uni or Reuters or BBC under International News – Country Studies & Intercultural Communication. Pro_Lab 12 1. Add a control to allow the user to change the accuracy setting for the sensor, and notice how the output changes when moving about using different settings.
  • 4. 2. The app now has database access code in several view controllers. To support a cleaner design, add a database access class that controls all access to Core Data and provides useful methods and properties to the rest of the app. 3. Turn off the user’s permission to access location for the App (in the Simulator, go to Settings > Privacy > Location). Run the app again and observe what happens. Is this appropriate behavior? How could it be improved? 4. What would happen if the code in Listing 13.10 was placed in viewDidLoad instead of viewWillAppear? (Check MapPoint.swift) 5. Change the text displayed on the pin to include the City for the contact. 6. Change the cell layout to use the other two styles. 7. Expand the settings screen to allow for specifying two sort fields. Then have the sorting be done by first one and then the other field. 8. Choose different fields from the Contact class to display in the table. 9. Change the display in the table to look like this instead: Main label: Superman from Metropolis. Detail Label: Born on: April 18, 1938. 10. Change the app so when the user taps the + button to add a new Contact, the Contact screen is put into edit mode and the cursor placed in the first text field. __MACOSX/._My Contact List __MACOSX/My Contact List/._My Contact List __MACOSX/My Contact List/._My Contact List.xcodeproj __MACOSX/My Contact List/._.git
  • 5. 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 {
  • 6. @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,
  • 7. 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: "%gu{00B0}", coordinate.latitude) lblLongitude.text = String(format: "%gu{00B0}", coordinate.longitude) }
  • 8. 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: "%gu{00B0}", coordinate.longitude) lblLatitude.text = String(format: "%gu{00B0}", coordinate.latitude) lblLocationAccuracy.text = String(format: "%gm", location.horizontalAccuracy) lblAltitude.text = String(format: "%gm", location.altitude) lblAltitudeAccuracy.text = String(format: "%gm", location.verticalAccuracy)
  • 9. } } } 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: "%gu{00B0} (%@)", theHeading, direction) lblHeadingAccuracy.text = String(format: "%gu{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)
  • 10. 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
  • 11. 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 } }
  • 12. 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 {
  • 13. 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)
  • 14. 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. } */ }
  • 15. __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 } }
  • 16. __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!
  • 17. @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
  • 18. 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)
  • 19. } 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 =
  • 20. 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:
  • 21. 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!)") }
  • 22. } } 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(notificatio n:)), name: UIResponder.keyboardDidShowNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(ContactsViewController.keyboardWillHide(notificatio n:)), name:
  • 23. 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 }
  • 24. /* // 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.
  • 25. // 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 customi zation 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 }
  • 26. 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.
  • 27. } 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.
  • 28. * 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)") } }
  • 29. } } __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
  • 30. 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.persisten tContainer.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)
  • 31. -> 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
  • 32. 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 {
  • 33. // 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
  • 34. } */ /* // 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
  • 35. // 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) }
  • 36. /* // 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
  • 37. 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
  • 38. 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()
  • 39. // 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!) } } }
  • 40. 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){
  • 41. 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"
  • 42. 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?
  • 43. 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
  • 44. 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 */
  • 45. 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 /*
  • 46. 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>";
  • 47. }; 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>"; };
  • 48. 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>"; };
  • 49. 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>"; };
  • 50. /* 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;
  • 51. 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 = (
  • 52. 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 */,
  • 53. ); 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_CONVERSIO N = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD
  • 54. = "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_IMPLEMENTATI ONS = 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;
  • 55. 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;
  • 56. 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_CONVERSIO N = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++";
  • 57. 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_IMPLEMENTATI ONS = 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 =
  • 58. 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;
  • 59. 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;
  • 60. }; 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 */, );
  • 61. 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 */;
  • 62. } __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
  • 63. 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" } }
  • 64. __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
  • 65. __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
  • 66. __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.x cdatamodel/contents __MACOSX/My Contact List/My Contact List/MyContactListModel.xcdatamodeld/MyContactListModel.x cdatamodel/._contents My Contact List/My Contact List/Assets.xcassets/sample-881- globe.imageset/sample-401-globe.png
  • 67. __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" } }
  • 68. __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"
  • 69. }, { "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" },
  • 70. { "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
  • 71. 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,
  • 72. "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",
  • 73. "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.xcuse rdatad My Contact List/My Contact List.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspac eChecks.plist IDEDidComputeMac32BitWarning __MACOSX/My Contact List/My Contact List.xcodeproj/project.xcworkspace/xcshareddata/._IDEWorksp aceChecks.plist
  • 74. My Contact List/.git/objects/51/a3522d1a8251d3583edae3501e302706 23b4e 9 My Contact List/.git/objects/51/a3522d1a8251d3583edae3501e30270623b4e 9 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. }
  • 75. */ } __MACOSX/My Contact List/.git/objects/51/._a3522d1a8251d3583edae3501e30270623b 4e9 My Contact List/.git/objects/93/d02855d732ed54e9a873ea163c5b0931fd3b2 8 My Contact List/.git/objects/93/d02855d732ed54e9a873ea163c5b0931fd3b2 8 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/._d02855d732ed54e9a873ea163c5b0931fd3b 28 My Contact List/.git/objects/94/12200eae4ad930a3bda72bb3665ad9b123436 f My Contact List/.git/objects/94/12200eae4ad930a3bda72bb3665ad9b123436 f blob 316�{
  • 76. "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/._12200eae4ad930a3bda72bb3665ad9b1234 36f My Contact List/.git/objects/b2/85dfbdc51b879e840fc0555565f2e481d6c8 fe 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.
  • 77. // 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/._85dfbdc51b879e840fc0555565f2e481d6c8 fe My Contact List/.git/objects/da/4a164c918651cdd1e11dca5cc62c333f097601 My Contact List/.git/objects/da/4a164c918651cdd1e11dca5cc62c333f097601
  • 78. blob 62�{ "info" : { "version" : 1, "author" : "xcode" } } __MACOSX/My Contact List/.git/objects/da/._4a164c918651cdd1e11dca5cc62c333f0976 01 My Contact List/.git/objects/bd/634d80717757250c9b639ee2bb5417c8185c1 b My Contact List/.git/objects/bd/634d80717757250c9b639ee2bb5417c8185c1 b 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/._634d80717757250c9b639ee2bb5417c8185 c1b My Contact List/.git/objects/d1/6f0eca20c54005e834e7339cc4838a2c904c46 My Contact
  • 79. 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. } */ }
  • 80. __MACOSX/My Contact List/.git/objects/d1/._6f0eca20c54005e834e7339cc4838a2c904c 46 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/._aa5890be1fe9b6fcc02f93173455ecf442e75 7 My Contact List/.git/objects/11/12069926cb82235d70c5ca1be944c6f427b2d 8 My Contact List/.git/objects/11/12069926cb82235d70c5ca1be944c6f427b2d 8 blob 253�{ "images" : [ { "idiom" : "universal", "filename" : "[email protected]", "scale" : "2x"
  • 81. }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } __MACOSX/My Contact List/.git/objects/11/._12069926cb82235d70c5ca1be944c6f427b2 d8 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()
  • 82. // 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/._bb798c463179d207542c2c0554f5aecf6962 d1 My Contact List/.git/objects/44/7805c2535443ad8c4487730db74c1667ee634 1 My Contact List/.git/objects/44/7805c2535443ad8c4487730db74c1667ee634 1 blob 2990�// // ContactsTableViewController.swift // My Contact List // // Created by Michael Eierman on 8/6/19. // Copyright © 2019 Learning Mobile Apps. All rights reserved.
  • 83. // 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 } /*
  • 84. 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 } } */
  • 85. /* // 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/._7805c2535443ad8c4487730db74c1667ee6
  • 86. 341 My Contact List/.git/objects/a9/5798642c33b00826cad4dc9c2d949 6a639b86 7 My Contact List/.git/objects/a9/5798642c33b00826cad4dc9c2d9496a639b86 7 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.
  • 87. // Pass the selected object to the new view controller. } */ } __MACOSX/My Contact List/.git/objects/a9/._5798642c33b00826cad4dc9c2d9496a639b 867 My Contact List/.git/objects/f9/2f7cb6f4a02aaeb2534504bea9569b4983af2a My Contact List/.git/objects/f9/2f7cb6f4a02aae b2534504bea9569b4983af2a blob 315�{ "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "[email protected]", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } }
  • 88. __MACOSX/My Contact List/.git/objects/f9/._2f7cb6f4a02aaeb2534504bea9569b4983af2 a My Contact List/.git/objects/48/c3d8a19a1cfa5de320310c63de76f8c81a7c34 My Contact List/.git/objects/48/c3d8a19a1cfa5de320310c63de76f8c81a7c34 __MACOSX/My Contact List/.git/objects/48/._c3d8a19a1cfa5de320310c63de76f8c81a7c 34 My Contact List/.git/objects/1e/0d01adc6f978d6275e73583222c77d493d5b7 7 My Contact List/.git/objects/1e/0d01adc6f978d6275e73583222c77d493d5b7 7 __MACOSX/My Contact List/.git/objects/1e/._0d01adc6f978d6275e73583222c77d493d5b 77 My Contact List/.git/objects/78/1aca185052a2d2bf29c3616dd99368c4b7e08 8 My Contact List/.git/objects/78/1aca185052a2d2bf29c3616dd99368c4b7e08 8 blob 359�{ "images" : [ { "idiom" : "universal", "filename" : "sample-401-globe.png",
  • 89. "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/._1aca185052a2d2bf29c3616dd99368c4b7e0 88 My Contact List/.git/objects/7f/5e4906c3aee1b2c91fa1f684694edb8d21cc4b My Contact List/.git/objects/7f/5e4906c3aee1b2c91fa1f684694edb8d21cc4b __MACOSX/My Contact List/.git/objects/7f/._5e4906c3aee1b2c91fa1f684694edb8d21cc4 b My Contact List/My Contact List.xcodeproj/xcuserdata/fredoseitutu.xcuserdatad/xcschemes/x cschememanagement.plist
  • 90. SchemeUserState My Contact List.xcscheme_^#shared#^_ orderHint 0 My Contact List/My Contact List.xcodeproj/xcuserdata/eierman.xcuserdatad/xcdebugger/Brea kpoints_v2.xcbkptlist __MACOSX/My Contact List/My Contact List.xcodeproj/xcuserdata/eierman.xcuserdatad/xcdebugger/._Br eakpoints_v2.xcbkptlist My Contact List/My Contact List.xcodeproj/xcuserdata/eierman.xcuserdatad/xcschemes/xcsc hememanagement.plist SchemeUserState My Contact List.xcscheme_^#shared#^_ orderHint 0
  • 91. __MACOSX/My Contact List/My Contact List.xcodeproj/xcuserdata/eierman.xcuserdatad/xcschemes/._xcs chememanagement.plist My Contact List/My Contact List.xcodeproj/project.xcworkspace/xcuserdata/fredoseitutu.xcu serdatad/UserInterfaceState.xcuserstate My Contact List/My Contact List.xcodeproj/project.xcworkspace/xcuserdata/eierman.xcuserd atad/.dat.nosync01d8.b0Tmr0 __MACOSX/My Contact List/My Contact List.xcodeproj/project.xcworkspace/xcuserdata/eierman.xcuserd atad/._.dat.nosync01d8.b0Tmr0 My Contact List/My Contact List.xcodeproj/project.xcworkspace/xcuserdata/eierman.xcuserd atad/UserInterfaceState.xcuserstate __MACOSX/My Contact List/My Contact List.xcodeproj/project.xcworkspace/xcuserdata/eierman.xcuserd atad/._UserInterfaceState.xcuserstate