You are previewing iOS 5 Programming Cookbook.

iOS 5 Programming Cookbook

Cover of iOS 5 Programming Cookbook by Vandad Nahavandipoor Published by O'Reilly Media, Inc.
  1. iOS 5 Programming Cookbook
    1. SPECIAL OFFER: Upgrade this ebook with O’Reilly
    2. A Note Regarding Supplemental Files
    3. Preface
      1. Audience
      2. Organization of This Book
      3. Additional Resources
      4. Conventions Used in This Book
      5. Using Code Examples
      6. We’d Like to Hear from You
      7. Safari® Books Online
      8. Acknowledgments
    4. 1. The Basics
      1. 1.0. Introduction
      2. 1.1. Creating a Simple iOS App in Xcode
      3. 1.2. Understanding Interface Builder
      4. 1.3. Compiling iOS Apps
      5. 1.4. Running iOS Apps on the Simulator
      6. 1.5. Running iOS Apps on iOS Devices
      7. 1.6. Packaging iOS Apps for Distribution
      8. 1.7. Declaring Variables in Objective-C
      9. 1.8. Allocating and Making Use of Strings
      10. 1.9. Comparing Values in Objective-C with an If Statement
      11. 1.10. Implementing Loops with For Statements
      12. 1.11. Implementing While Loops
      13. 1.12. Creating Custom Classes
      14. 1.13. Defining Functionality for Classes
      15. 1.14. Defining Two or More Methods with the Same Name
      16. 1.15. Allocating and Initializing Objects
      17. 1.16. Adding Properties to Classes
      18. 1.17. Moving From Manual Reference Counting to Automatic Reference Counting
      19. 1.18. Typecasting with Automatic Reference Counting
      20. 1.19. Delegating Tasks with Protocols
      21. 1.20. Determining Whether Instance or Class Methods Are Available
      22. 1.21. Determining Whether a Class Is Available at Runtime
      23. 1.22. Allocating and Making Use of Numbers
      24. 1.23. Allocating and Making Use of Arrays
      25. 1.24. Allocating and Making Use of Dictionaries
      26. 1.25. Allocating and Making Use of Sets
      27. 1.26. Creating Bundles
      28. 1.27. Loading Data From the Main Bundle
      29. 1.28. Loading Data From Other Bundles
      30. 1.29. Sending Notifications with NSNotificationCenter
      31. 1.30. Listening for Notifications Sent From NSNotificationCenter
    5. 2. Implementing Controllers and Views
      1. 2.0. Introduction
      2. 2.1. Displaying Alerts with UIAlertView
      3. 2.2. Creating and Using Switches with UISwitch
      4. 2.3. Picking Values with UIPickerView
      5. 2.4. Picking the Date and Time with UIDatePicker
      6. 2.5. Implementing Range Pickers with UISlider
      7. 2.6. Grouping Compact Options with UISegmentedControl
      8. 2.7. Presenting and Managing Views with UIViewController
      9. 2.8. Implementing Navigation with UINavigationController
      10. 2.9. Manipulating a Navigation Controller’s Array of View Controllers
      11. 2.10. Displaying an Image on a Navigation Bar
      12. 2.11. Adding Buttons to Navigation Bars Using UIBarButtonItem
      13. 2.12. Presenting Multiple View Controllers with UITabBarController
      14. 2.13. Displaying Static Text with UILabel
      15. 2.14. Accepting User Text Input with UITextField
      16. 2.15. Displaying Long Lines of Text with UITextView
      17. 2.16. Adding Buttons to the User Interface with UIButton
      18. 2.17. Displaying Images with UIImageView
      19. 2.18. Creating Scrollable Content with UIScrollView
      20. 2.19. Loading Web Pages with UIWebView
      21. 2.20. Presenting Master-Detail Views with UISplitViewController
      22. 2.21. Enabling Paging with UIPageViewController
      23. 2.22. Displaying Popovers with UIPopoverController
      24. 2.23. Displaying Progress with UIProgressView
      25. 2.24. Listening and Reacting to Keyboard Notifications
    6. 3. Constructing and Using Table Views
      1. 3.0. Introduction
      2. 3.1. Instantiating a Table View
      3. 3.2. Assigning a Delegate to a Table View
      4. 3.3. Populating a Table View with Data
      5. 3.4. Receiving and Handling Table View Events
      6. 3.5. Using Different Types of Accessories in a Table View Cell
      7. 3.6. Creating Custom Table View Cell Accessories
      8. 3.7. Displaying Hierarchical Data in Table Views
      9. 3.8. Enabling Swipe Deletion of Table View Cells
      10. 3.9. Constructing Headers and Footers in Table Views
      11. 3.10. Displaying Context Menus on Table Views Cells
      12. 3.11. Moving Cells and Sections in Table Views
      13. 3.12. Deleting Cells and Sections From Table Views
    7. 4. Storyboards
      1. 4.0. Introduction
      2. 4.1. Creating a Project with Storyboards
      3. 4.2. Adding a Navigation Controller to a Storyboard
      4. 4.3. Passing Data From One Screen to Another
      5. 4.4. Adding a Storyboard to an Existing Project
    8. 5. Concurrency
      1. 5.0. Introduction
      2. 5.1. Constructing Block Objects
      3. 5.2. Accessing Variables in Block Objects
      4. 5.3. Invoking Block Objects
      5. 5.4. Dispatching Tasks to Grand Central Dispatch
      6. 5.5. Performing UI-Related Tasks with GCD
      7. 5.6. Performing Non-UI Related Tasks Synchronously with GCD
      8. 5.7. Performing Non-UI Related Tasks Asynchronously with GCD
      9. 5.8. Performing Tasks After a Delay with GCD
      10. 5.9. Performing a Task Only Once with GCD
      11. 5.10. Grouping Tasks Together with GCD
      12. 5.11. Constructing Your Own Dispatch Queues with GCD
      13. 5.12. Running Tasks Synchronously with Operations
      14. 5.13. Running Tasks Asynchronously with Operations
      15. 5.14. Creating Dependency Between Operations
      16. 5.15. Creating Timers
      17. 5.16. Creating Concurrency with Threads
      18. 5.17. Invoking Background Methods
      19. 5.18. Exiting Threads and Timers
    9. 6. Core Location and Maps
      1. 6.0. Introduction
      2. 6.1. Creating a Map View
      3. 6.2. Handling the Events of a Map View
      4. 6.3. Pinpointing the Location of a Device
      5. 6.4. Displaying Pins on a Map View
      6. 6.5. Displaying Pins with Different Colors on a Map View
      7. 6.6. Displaying Custom Pins on a Map View
      8. 6.7. Converting Meaningful Addresses to Longitude and Latitude
      9. 6.8. Converting Longitude and Latitude to a Meaningful Address
    10. 7. Implementing Gesture Recognizers
      1. 7.0. Introduction
      2. 7.1. Detecting Swipe Gestures
      3. 7.2. Detecting Rotation Gestures
      4. 7.3. Detecting Panning and Dragging Gestures
      5. 7.4. Detecting Long Press Gestures
      6. 7.5. Detecting Tap Gestures
      7. 7.6. Detecting Pinch Gestures
    11. 8. Networking, JSON, XML, and Twitter
      1. 8.0. Introduction
      2. 8.1. Downloading Asynchronously with NSURLConnection
      3. 8.2. Handling Timeouts in Asynchronous Connections
      4. 8.3. Downloading Synchronously with NSURLConnection
      5. 8.4. Modifying a URL Request with NSMutableURLRequest
      6. 8.5. Sending HTTP GET Requests with NSURLConnection
      7. 8.6. Sending HTTP POST Requests with NSURLConnection
      8. 8.7. Sending HTTP DELETE Requests with NSURLConnection
      9. 8.8. Sending HTTP PUT Requests with NSURLConnection
      10. 8.9. Serializing Arrays and Dictionaries into JSON
      11. 8.10. Deserializing JSON into Arrays and Dictionaries
      12. 8.11. Integrating Twitter Functionality into Your Apps
      13. 8.12. Parsing XML with NSXMLParser
    12. 9. Audio and Video
      1. 9.0. Introduction
      2. 9.1. Playing Audio Files
      3. 9.2. Handling Interruptions While Playing Audio
      4. 9.3. Recording Audio
      5. 9.4. Handling Interruptions While Recording Audio
      6. 9.5. Playing Audio Over Other Active Sounds
      7. 9.6. Playing Video Files
      8. 9.7. Capturing Thumbnails From a Video File
      9. 9.8. Accessing the Music Library
    13. 10. Address Book
      1. 10.0. Introduction
      2. 10.1. Retrieving a Reference to an Address Book
      3. 10.2. Retrieving All the People in the Address Book
      4. 10.3. Retrieving Properties of Address Book Entries
      5. 10.4. Inserting a Person Entry into the Address Book
      6. 10.5. Inserting a Group Entry into the Address Book
      7. 10.6. Adding Persons to Groups
      8. 10.7. Searching the Address Book
      9. 10.8. Retrieving and Setting a Person’s Address Book Image
    14. 11. Camera and the Photo Library
      1. 11.0. Introduction
      2. 11.1. Detecting and Probing the Camera
      3. 11.2. Taking Photos with the Camera
      4. 11.3. Taking Videos with the Camera
      5. 11.4. Storing Photos in the Photo Library
      6. 11.5. Storing Videos in the Photo Library
      7. 11.6. Retrieving Photos and Videos From the Photo Library
      8. 11.7. Retrieving Assets From the Assets Library
      9. 11.8. Editing Videos on an iOS Device
    15. 12. Multitasking
      1. 12.0. Introduction
      2. 12.1. Detecting the Availability of Multitasking
      3. 12.2. Completing a Long-Running Task in the Background
      4. 12.3. Receiving Local Notifications in the Background
      5. 12.4. Playing Audio in the Background
      6. 12.5. Handling Location Changes in the Background
      7. 12.6. Saving and Loading the State of Multitasking iOS Apps
      8. 12.7. Handling Network Connections in the Background
      9. 12.8. Handling Notifications Delivered to a Waking App
      10. 12.9. Responding to Changes in App Settings
      11. 12.10. Opting Out of Multitasking
    16. 13. Core Data
      1. 13.0. Introduction
      2. 13.1. Creating a Core Data Model with Xcode
      3. 13.2. Generating Class Files for Core Data Entities
      4. 13.3. Creating and Saving Data Using Core Data
      5. 13.4. Reading Data From Core Data
      6. 13.5. Deleting Data From Core Data
      7. 13.6. Sorting Data in Core Data
      8. 13.7. Boosting Data Access in Table Views
      9. 13.8. Implementing Relationships in Core Data
    17. 14. Dates, Calendars, and Events
      1. 14.0. Introduction
      2. 14.1. Retrieving the List of Calendars
      3. 14.2. Adding Events to Calendars
      4. 14.3. Accessing the Contents of Calendars
      5. 14.4. Removing Events From Calendars
      6. 14.5. Adding Recurring Events to Calendars
      7. 14.6. Retrieving the Attendees of an Event
      8. 14.7. Adding Alarms to Calendars
      9. 14.8. Handling Event Changed Notifications
      10. 14.9. Presenting Event View Controllers
      11. 14.10. Presenting Event Edit View Controllers
    18. 15. Graphics and Animations
      1. 15.0. Introduction
      2. 15.1. Enumerating and Loading Fonts
      3. 15.2. Drawing Text
      4. 15.3. Constructing, Setting, and Using Colors
      5. 15.4. Drawing Images
      6. 15.5. Drawing Lines
      7. 15.6. Constructing Paths
      8. 15.7. Drawing Rectangles
      9. 15.8. Adding Shadows to Shapes
      10. 15.9. Drawing Gradients
      11. 15.10. Displacing Shapes Drawn on Graphic Contexts
      12. 15.11. Scaling Shapes Drawn on Graphic Contexts
      13. 15.12. Rotating Shapes Drawn on Graphic Contexts
      14. 15.13. Animating and Moving Views
      15. 15.14. Animating and Scaling Views
      16. 15.15. Animating and Rotating Views
    19. 16. Core Motion
      1. 16.0. Introduction
      2. 16.1. Detecting the Availability of an Accelerometer
      3. 16.2. Detecting the Availability of a Gyroscope
      4. 16.3. Retrieving Accelerometer Data
      5. 16.4. Detecting Shakes on an iOS Device
      6. 16.5. Retrieving Gyroscope Data
    20. 17. iCloud
      1. 17.0. Introduction
      2. 17.1. Setting Up Your App for iCloud
      3. 17.2. Storing and Synchronizing Dictionaries in iCloud
      4. 17.3. Creating and Managing Folders for Apps in iCloud
      5. 17.4. Searching for Files and Folders in iCloud
      6. 17.5. Storing User Documents in iCloud
      7. 17.6. Managing the State of Documents in iCloud
      8. 17.7. Handling Conflicts in iCloud Documents
    21. Index
    22. About the Author
    23. Colophon
    24. SPECIAL OFFER: Upgrade this ebook with O’Reilly
O'Reilly logo

4.2. Adding a Navigation Controller to a Storyboard

Problem

You want to be able to manage multiple view controllers inside a storyboard-based application.

Solution

Set a navigation controller as the initial view controller of your storyboard file.

Discussion

If you followed the instructions in Recipe 4.1 and are now running your app on the iPhone Simulator, you’ll see just a white screen with no navigation bar across the top. The reason is that the initial view controller of our storyboard file is a view controller, as opposed to a navigation controller. In order to add a navigation controller to your storyboard-based app, simply follow these steps:

  1. Click on the iPhone storyboard that Xcode created for you. I have named my project Adding a Navigation Bar to a Storyboard. My iPhone storyboard file is MainStoryboard_iPhone.storyboard (the name of the default storyboard file created by Xcode, depending on the version of Xcode you are using, does not have to have any connection to the name of your project). Once you click on this file, Interface Builder will display its contents.

  2. Once the storyboard file is open in IB (Interface Builder), simply double-click on an empty space on the storyboard’s canvas and you will see the content shrink in size and give you more free space to play with, as you can see in Figure 4-6.

  3. Under the View menu, select UtilitiesShow Object Library.

  4. In the Object Library, find the Navigation Controller object (see Figure 4-7) and drag and drop it into the storyboard, to the left side of your existing view controller (Figure 4-6). Now you will see something similar to Figure 4-8.

  5. As you can see in Figure 4-8, the navigation controller has now added another view controller to our UI. What you need to do is to simply delete this view controller. Do so by selecting it and then pressing the Delete button on the keyboard. Now you are left with the navigation controller and your original view controller, as you can see in Figure 4-9.

The zoomed out view of an iPhone storyboard

Figure 4-6. The zoomed out view of an iPhone storyboard

The Navigation Controller object in the Object Library

Figure 4-7. The Navigation Controller object in the Object Library

A navigation controller comes with its own root view controller

Figure 4-8. A navigation controller comes with its own root view controller

Removing the root view controller that comes with the navigation controller object

Figure 4-9. Removing the root view controller that comes with the navigation controller object

Note

The project that we set up in Recipe 4.1 is a Single View Application. This type of application does not come with a navigation controller by default, for the obvious reason that it is a Single View Application. Therefore, to change this structure, we will need to add the navigation controller to our storyboard file manually.

  1. Now click once on the navigation controller object on the storyboard. Once the navigation controller object is selected, hold down the Control key on your keyboard and the left button on your mouse and drag your mouse over to the view controller (on the right) that was originally on your storyboard. This will draw a line from the navigation controller all the way to the view controller, as you can see in Figure 4-10.

    Connecting the navigation controller to the initial view controller

    Figure 4-10. Connecting the navigation controller to the initial view controller

  2. Now release your mouse button, at which point you will be presented with a dialog asking you what type of connection you want to create between the navigation and the view controller. Select the rootViewController item from the list by simply clicking on it (see Figure 4-11).

  3. After this is done, the storyboard will show that your navigation controller is connected to the original view controller, as you can see in Figure 4-12.

    Setting a view controller as the root of a navigation controller

    Figure 4-11. Setting a view controller as the root of a navigation controller

    The navigation controller is connected to the initial view controller

    Figure 4-12. The navigation controller is connected to the initial view controller

  4. The last but perhaps most important step is to make your navigation controller the initial/root view controller. If you don’t do this, the storyboard will use the view controller that it initially assigned as the initial view controller. Have another look at Figure 4-12. Can you see that the view controller on the right side has a colorful border around it? That indicates an initial view controller. To make your navigation the initial view controller, simply select the Navigation Controller under the Navigation Controller Scene panel in Interface Builder, as you can see in Figure 4-13. Now select the View menu in Xcode and choose ViewShow Attributes Inspector. Once the attributes inspector is opened, under the View Controller category, check the Is Initial View Controller checkbox (see Figure 4-14).

Selecting the navigation controller in Interface Builder

Figure 4-13. Selecting the navigation controller in Interface Builder

Selecting a navigation controller as the initial view controller of a storyboard

Figure 4-14. Selecting a navigation controller as the initial view controller of a storyboard

As you can see, your navigation controller now has a border around it instead of the right-hand view controller. Now if you run your application, you will notice that the initial view controller has a navigation bar on top, indicating that this view controller now has a navigation controller (Figure 4-15). In the next recipes, we will see how we can make use of the navigation controller to display new scenes on the screen.

We now have a navigation controller with a view controller inside it, but our objective now is to trigger an action and then move from one view controller to another—what Apple calls a segue. All right then; let’s place a button on our view controller and push a view controller into the stack once the user presses the button. Sounds good? Do it as follows:

  1. Go back to your .storyboard file.

  2. In the Object Library, find the View Controller object (see Figure 4-16) and drag and drop it onto the storyboard, on the right side of your existing view controller, as shown in Figure 4-17.

    The navigation bar on a view controller created with a storyboard

    Figure 4-15. The navigation bar on a view controller created with a storyboard

    A view controller object in the Object Library

    Figure 4-16. A view controller object in the Object Library

    Adding a new view controller to a storyboard

    Figure 4-17. Adding a new view controller to a storyboard

  3. In Object Library, find the Button object (see Figure 4-18) and drag and drop it into the first view controller (see Figure 4-19). Note that if you are zoomed out, Interface Builder will not allow you to drop a button onto a view controller. You need to double-click on an empty space on your storyboard to zoom into it before Interface Builder allows you to drop UI components onto your view controllers.

  4. Now to select the button, hold down the Control key on your keyboard and the left mouse button over the button, and drag it all the way to the second view controller (see Figure 4-20).

    Selecting the Button object in the Object Library

    Figure 4-18. Selecting the Button object in the Object Library

    Dropping a button on the first view controller in our storyboard

    Figure 4-19. Dropping a button on the first view controller in our storyboard

    Connecting a button to another view controller in a storyboard

    Figure 4-20. Connecting a button to another view controller in a storyboard

  5. Now lift your fingers off the mouse button and the Control key on your keyboard. You will now be presented with a dialog similar to that shown in Figure 4-21. Click on the performSegueWithIdentifier:sender: item.

Making a button perform a segue

Figure 4-21. Making a button perform a segue

Now if you have a look at your storyboard, you will see that the first view controller is connected to the second view controller, as shown in Figure 4-22.

The first view controller is connected to the second view controller through a segue

Figure 4-22. The first view controller is connected to the second view controller through a segue

Now if you run your app and tap on the button on the first view controller, you’ll see that the second view controller will automatically get pushed onto the stack of view controllers. Once the second view controller is presented, you will see a back button on the navigation bar. If you press that button, you will be sent back to the first view controller.

See Also

Recipe 4.1

The best content for your career. Discover unlimited learning on demand for around $1/day.