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

1.19. Delegating Tasks with Protocols

Problem

You want to make sure a certain object implements a set of methods or properties.

Solution

Use a protocol.

Discussion

A protocol is the declaration (as opposed to implementation) of a set of methods and/or properties in a header file (usually with the extension of .h). Any object that you declare to conform to such protocol is responsible for writing the implementation of those methods and properties, depending on whether the protocol specifies them as required or optional.

Think of protocols as set of rules (some rules being optional and some mandatory). Any object saying that it conforms to that protocol must follow those rules. Let’s see a simple example of this. We will go ahead and define a protocol called PersonProtocol. For this, you need to create a new protocol file, so follow these steps first:

  1. In Xcode, while your project is open, go to the File menu and then choose NewNew File...

  2. Now make sure iOS is the main category on the left side of the New File dialog and then choose the Cocoa Touch subcategory. Once that is done, choose the Objective-C Protocol item and press Next (see Figure 1-26).

  3. Now you will be asked to save this file and specify a name for it. Give it the name PersonProtocol and press Save (see Figure 1-27).

Now we have our header file. Let’s get on with the actual declaration of our protocol. Our objective with this new PersonProtocol protocol is to govern the rules on any class that impersonates a “Person”, or in other words, says that it is a Person class. For instance, in your application, you can have a class named Infant, Mother, Father, Son, Daughter, Stranger, etc. You can then make all these classes conform to the PersonProtocol protocol, which will define the types of behavior each of these classes must implement. Let’s say that, for every person, we need at least a first name, a last name, and an age:

Creating a new protocol

Figure 1-26. Creating a new protocol

Saving the new protocol

Figure 1-27. Saving the new protocol

#import <Foundation/Foundation.h>

@protocol PersonProtocol <NSObject>

@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, unsafe_unretained) NSUInteger age;

@end

Now let’s create a class called Father and make sure that this class conforms to our PersonProtocol protocol. To create this class, follow these steps:

  1. In Xcode, while in your project, go to the File menu and then select NewNew File...

  2. In the New File dialog, make sure iOS is the main category and then choose the Cocoa Touch subcategory. After that is done, select the Objective-C class item in the list on the righthand side. Now press the Next button (see Figure 1-28).

Creating a Father class

Figure 1-28. Creating a Father class

  1. In this screen (see Figure 1-29), make sure we are creating a subclass of NSObject. Once that is done, press the Next button.

  2. Now you are asked to save the new class. Give it the name of Father, and press the Create button (see Figure 1-30).

Subclassing NSObject to create a Father class

Figure 1-29. Subclassing NSObject to create a Father class

Saving the Father class on disk

Figure 1-30. Saving the Father class on disk

Fantastic, we now have our Father class and the PersonProtocol protocol. Open the header file of the Father class and make sure that it conforms to the PersonProtocol protocol:

#import <Foundation/Foundation.h>
#import "PersonProtocol.h"

@interface Father : NSObject <PersonProtocol>

@end

Now if you attempt to compile your app (by pressing Command+Shift+R simultaneously), you will get warnings from the compiler, similar to those shown in Figure 1-31.

Warnings from the compiler related to the protocol we are conforming to

Figure 1-31. Warnings from the compiler related to the protocol we are conforming to

As you can see, the compiler understands that the Father class wants to conform to the PersonProtocol protocol. However, the Father class isn’t implementing the required setter and getter methods of the properties defined in the PersonProtocol protocol. We are seeing these warnings because anything defined in a protocol by default is required from its conforming classes. Required methods and properties in a protocol can explicitly be marked with the @required keyword. If you want to specify that followers of a protocol are free to choose to implement or not implement your methods or properties, you can simply tell the compiler that those methods/properties are optional, using the @optional keyword.

Let’s go back to PersonProtocol.h and mark the firstName, lastName, and age properties as optional, but add a method to the protocol called breathe and make it a required method, because, let’s face it, everybody has got to breathe:

#import <Foundation/Foundation.h>

@protocol PersonProtocol <NSObject>

@optional
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, unsafe_unretained) NSUInteger age;

@required
- (void) breathe;

@end

Now if you compile your application, you will get completely different warnings (see Figure 1-32).

The Father class does not implement the breathe method defined in the PersonProtocol protocol

Figure 1-32. The Father class does not implement the breathe method defined in the PersonProtocol protocol

Now if you go to the Father class and define and implement the breathe method, even if the method implementation is empty, the compiler will be happy with that. Remember, the Father class now doesn’t have to implement the three aforementioned properties because they are now defined as optional in the PersonProtocol protocol. Here is now the correct definition of the Father class:

#import <Foundation/Foundation.h>
#import "PersonProtocol.h"

@interface Father : NSObject <PersonProtocol>

- (void) breathe;

@end

And here is the correct implementation of the Father class:

#import "Father.h"

@implementation Father

- (void) breathe{
  /* Implement this method here */
}

@end

Attempt to compile your app now and you’ll notice that the compiler is perfectly happy with our implementation.

Cocoa Touch has given protocols a really nice meaning in Objective-C. In Cocoa Touch, protocols are the perfect means for defining delegate objects. A delegate object is an object that another object consults when something happens in that object. For instance, a repairman is the delegate for a broken-down car. If something happens to your car, you go to your repairman and ask him to fix the car for you (although some prefer to repair the car themselves, in which case, they are their own delegate for their car). So in Cocoa Touch, many classes expect a delegate object and make sure that whatever object is assigned as their delegate conforms to a certain protocol.

For instance, as we will see in Chapter 3, the UITableView class defines and implements a property called delegate, which is required to conform to the UITableViewDelegate protocol. This protocol simply lays down the law to those objects that want to become the delegate object of a table view. The protocol requires those objects to implement certain methods or in some cases, specifies that some methods/properties are optional so the delegate object is free to implement or not implement them. Now, when a user selects a row in a table, the UITableView can call the tableView:didSelectRowAtIndexPath: method with the assurance that the UITableViewDelegate at least defined the method. The method may be correctly or incorrectly coded, but at least it’s present, so the program won’t crash at runtime because of a nonexistent method (selector).

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