Chapters

Hide chapters

UIKit Apprentice

Third Edition · iOS 18 · Swift 5.10 · Xcode 16

My Locations

Section 3: 11 chapters
Show chapters Hide chapters

Store Search

Section 4: 13 chapters
Show chapters Hide chapters

30. Image Picker
Written by Fahim Farook

Heads up... You’re accessing parts of this content for free, with some sections shown as scrambled text.

Heads up... You’re accessing parts of this content for free, with some sections shown as scrambled text.

Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.

Unlock now

Your Tag Locations screen is mostly feature complete — except for the ability to add a photo for a location. Time to fix that!

UIKit comes with a built-in view controller, UIImagePickerController, that lets the user take new photos and videos, or pick them from their Photo Library. You’re going to use it to save a photo along with the location so the user has a nice picture to look at.

This is what your screen will look like when you’re done:

A photo in the Tag Location screen
A photo in the Tag Location screen

In this chapter, you will do the following:

  • Add an image picker: Add an image picker to your app to allow you to take photos with the camera or to select existing images from your photo library.
  • Show the image: Show the picked image in a table view cell.
  • UI improvements: Improve the user interface functionality when your app is sent to the background.
  • Save the image: Save the image selected via the image picker on device so that it can be retrieved later.
  • Edit the image: Display the image on the edit screen if the location has an image.
  • Thumbnails: Display thumbnails for locations on the Locations list screen.

Add an image picker

Just as you need to ask the user for permission before you can get GPS information from the device, you need to ask for permission to access the user’s photo library.

You don’t need to write any code for this, but you do need to declare your intentions in the app’s Info tab. If you don’t do this, the app will crash with no visible warnings except for a message in the Xcode Console, as soon as you try to use the UIImagePickerController.

Info tab changes

➤ Go to the project’s Info tab and add a new row — either use the plus (+) button on existing rows, or right-click and select Add Row.

Alwihw e ugugu jomwlojcooz co Ezme geb
Oqzuvr i ekace delkjockieq vu Ejzu hel

Use camera to add image

➤ In LocationDetailsViewController.swift, add the following extension to the end of the source file:

Rme mokaco uwcagbudi
Hsa pequdu ohqizpuse

Use photo library to add image

You can still test the image picker on the Simulator, but instead of using the camera, you have to use the photo library.

Fmu oEF nmetah mapqezy ip zbu bilerugaw
Jyu aIQ rciwiy reccoqj uy xqe somuhevaw

Adding photos to the simulator

There are several ways you can add new photos to the Simulator. You can go into Safari on the Simulator, search the internet for an image, press down on the image until a menu appears, and then choose Add to Photos.

Cga owef fak mceef gda broji
Xyu ufex sos cduev qla xgexi

Choose between camera and photo library

First, you check whether the camera is available. When it is, you show an action sheet to let the user choose between the camera and the Photo Library.

Jqo akmoay wvuej lsid voyl giu cvaigu nimzoet diqiri avj ndusu juwwodt
Cfo iyteom cyiok fqas pitm muo yhuumi yuzrueq huwuzi aml vlufa qubqebs

Show the image

Now that the user can pick a photo, you should display it somewhere — what’s the point otherwise, right? You’ll change the Add Photo cell to hold the photo and when a photo is picked, the cell will grow to fit the photo and the Add Photo label will disappear.

Ihpuqc uf Exejo Vail wi xzu Ell Rzela zijs
Ajsont ib Uqami Heah qi csi Anp Tdoto bexg

Ohafa Weaq Ooda Kapuup wafczwiodsv
Ufusa Yuos Oeyo Zohuan mojkhjoidhw

Dbo gseti im zoxw
Nva dpelu un yert

Resize table view cell to show image

➤ Add a new outlet for the image height constraint to LocationDetailsViewController.swift:

Becniqg ryi uukzom zux vgo jezlcheojw
Rohtawx qki ieqpeh wig npo pinlywuujx

Zse steno vilcwefv wercatsng
Gla ttuha xuyzsivl lowweshxg

UI improvements

The user can take a photo — or pick one — now but the app doesn’t save it to the data store yet. Before you get to that, there are still a few improvements to make to the image picker.

Handle background mode

You saw in the Checklists app that the SceneDelegate is notified by the operating system when the app is about to go to the background through its sceneDidEnterBackground(_:) method.

Remove notification observers

Now that you’ve add a notification to the NotificationCenter, prior to iOS 9.0, you had to also remove that notification telling the NotificationCenter to stop sending these background notifications when the Tag/Edit Location screen closes. You didn’t want NotificationCenter to send notifications to an object that no longer existed, that was just asking for trouble!

Closures and capturing

Remember how in closures you always have to specify self when you want to access an instance variable or call a method? That is because closures capture any variables that are used inside the closure.

HewotoevPaviuhj HoerMijqdepyex ogvobzeq Vruguso Zumxuge “kebc” DZRizevegaraof Gumpep UUMov rpwapp npbegw tqdunq hnjavy
Wfu lufupaustlap cimjoey vju gioz mahvvuzkag ovw nka ymezure

Save the image

The ability to pick photos is rather useless if the app doesn’t also save them. So, that’s what you’ll do here.

Data model changes

➤ Open the Data Model editor. Add a photoID attribute to the Location entity and give it the type Integer 32. This is an optional value — not all Locations will have photos — so make sure the Optional box is checked in the Data Model inspector.

Save the image to a file

➤ In LocationDetailsViewController.swift, in the done() method, add the following in between where you set the properties of the Location object and where you save the managed object context:

Hvo dqugi ex pefic ez nmo epx’f Tuyisoqjw yalyah
Bzi twafo oq qipow ab two ivp’g Luhihughd kozvos

Verify photoID in SQLite

If you have Liya or another SQLite inspection tool, you can verify that each Location object has been given a unique photoID value (in the ZPHOTOID column):

Gwe Yuwobuup uxrotvs cott evavii pligaEs gebaej ud Sata
Tmo Wejepouk opvigvs ping enapua pqoyoAf wefaos ig Kuha

Edit the image

So far, all the changes you’ve made were for the Tag Location screen and adding new locations. Of course, you should make the Edit Location screen show the photos as well. The change to LocationDetailsViewController is quite simple.

Clean up on location deletion

There’s another editing operation the user can perform on a location: deletion. What happens to the image file when a location is deleted? At the moment nothing. The photo for that location stays forever in the app’s Documents directory.

Thumbnails

Now that locations can have photos, it’s a good idea to show thumbnails for these photos in the Locations tab. That will liven up this screen a little… a plain table view with just a bunch of text isn’t particularly exciting.

Storyboard changes

➤ Go to the storyboard editor. In the prototype cell for the Locations scene, remove the leading Auto Layout constraint from each of the two labels, and set X = 76 in the View section of the Size inspector.

Nlo neyju joep zipq zon ug owawo teot
Cya pekya wuoq huwr weh ep ixose mais

Code changes

➤ Go to LocationCell.swift and add the following method:

Atakiz en vxe Lejexiebm lilye heeg
Ukosih ot bqo Rizibaoyk nipca qoog

Extensions

So far you’ve used extensions on your view controllers to group related functionality together, such as delegate methods. But you can also use extensions to add new functionality to classes that you didn’t write yourself. That includes classes such as UIImage from the iOS frameworks.

Thumbnails via UIImage extension

You are going to add an extension to UIImage that lets you resize the image. You’ll use it as follows:

Gyu xkubfguelm lan qiub fqiob
Ghe xsipwnoabq ven jeap rwiaq

Eczirx Xav qp. Omsuzt Focx
Ottuvl Zaz jt. Erlirc Zuxt

Handling low-memory situations

The UIImagePickerController is very memory-hungry. Whenever the iPhone gets low on available memory, UIKit will send your app a “low memory” warning.

Have a technical question? Want to report a bug? You can ask questions and report bugs to the book authors in our official book forum here.
© 2026 Kodeco Inc.

You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.

Unlock now