Apple Objective-C programming fundamentals. Working with Data, Part 2, Create the data model

In this part of the series we will continue the development of our data store app that we set up in the first part of the series.

Create the Data Model

  • Open your sample application that you created in the first part
  • Open the Project Navigator
  • Select the Supporting Files group
  • Click the plus (+) sign in the lower left corner of the screen
  • Select New File… in the pop-up
  • Under iOS select Core Data on the left side
  • Select the Data Model icon in the middle of the window
  •  Click the Next to save the file

xcode create data model

 

Add an Entity to the data model

  • Open the .xdatamodeld file in the Project Navigator
  • Click the Add Entity button at the bottom of the screen
    xcode data add entity
  • In the upper right corner of the window under Entities name the entity Event
    xcode data entity name

Add an attribute to the Entity

  • Click the plus (+) sign at the bottom of the Attribute section of the window
    xcode data add attribute
  • Name the attribute creationDate, and set the type to Date in the pop-up menu
    xcode data attribute date
  • Add another attribute, name it as latitude and set the type to Double
  • Add a third attribute, name it longitude and set the type to Double
    As you are adding the new attributes the rows jump around to be displayed alphabetically, so make sure you are setting the type of the correct row.
    The attributes of the Event entity should look like this
    xcode data event attributes

Create a custom class to represent the Event entity to be able to create methods for the entity

  • Select the Event entity on the window
  • In the File menu select New -> New File…
  • In the New File dialog, select NSManagedObject subclass
    xcode data create managed object subclass
  • Click the Next button
  • Save the file in the project folder

Import the new class into the ViewController

  • Add the following to the RootViewController.m implementation file
    #import "Event.h"

Apple Objective-C programming fundamentals. Working with Data, Part 1, The App

This article will guide you to create an app that stores data on the user’s device. To create our sample app to store data on the user’s device

  • Start Xcode, the Apple IDE for IOS development
  • Create a new project
  • Open the AppDelegate.h file and enter the following into the @interface section before the @end
    @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
    @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
    @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
    
    - (NSURL *)applicationDocumentsDirectory;
    - (void)saveContext;

    The lines above define three properties and two methods. The properties provide access to the Core Data framework of IOS, and the saveContext method will save you changes in the data file.

The Apple Core Data framework uses the following terminology

managed object

The table row

managed object context

Table rows that are in the memory and not saved to the database yet

managed object model

Describes the database, stores the relationships between the tables

entity description

Describes a table

persistent store coordinator

Manages a collection of persistent object stores, data files on the disk

 

  • In Xcode create a new class: RootViewController and make it the subclass of UITableViewController

xcode rootviewcontroller

  • Open the RootViewController.h header file and replace the content with the following
#import <CoreLocation/CoreLocation.h>

@interface RootViewController : UITableViewController  {

    NSMutableArray *eventsArray;
    NSManagedObjectContext *managedObjectContext;

    CLLocationManager *locationManager;
    UIBarButtonItem *addButton;
}

@property (nonatomic, retain) NSMutableArray *eventsArray;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

@property (nonatomic, retain) CLLocationManager *locationManager;
@property (nonatomic, retain) UIBarButtonItem *addButton;

@end
  • Open the RootViewController.m class file and add the following to the @implementation section
// Synthesize the properties to tell the compiler how to name them
@synthesize eventsArray;
@synthesize managedObjectContext;
@synthesize addButton;
@synthesize locationManager;
  • Write the Accessor Method for the Core Location Manager
// Create an accessor method to dynamically create the Core Location manager on demand
- (CLLocationManager *)locationManager {

    if (locationManager != nil) {
        return locationManager;
    }

    locationManager = [[CLLocationManager alloc] init];
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
    locationManager.delegate = self;

    return locationManager;
}
  • Add the following two Core Location manager delegate methods
// Implement two delegate methods to enable and disable the Add button as appropriate.
// If the Core Location manager is generating updates, then enable the button;
// if the Core Location manager is failing, then disable the button
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation {
    addButton.enabled = YES;
}

- (void)locationManager:(CLLocationManager *)manager
       didFailWithError:(NSError *)error {
    addButton.enabled = NO;
}
  • Replace the implementation of viewDidLoad with the following:
- (void)viewDidLoad {

    [super viewDidLoad];

    // Set the title.
    self.title = @"Locations";

    // Set up the buttons.
    self.navigationItem.leftBarButtonItem = self.editButtonItem;

    // The viewDidLoad method needs to set up the Core Location manager and the Add and Edit buttons.
    addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
    target:self action:@selector(addEvent)];
    addButton.enabled = NO;
    self.navigationItem.rightBarButtonItem = addButton;

    // Start the location manager.
    [[self locationManager] startUpdatingLocation];
}
  • Implement Methods for Memory Management
// Replace the existing implementations of viewDidUnload and dealloc. The implementation of viewDidUnload // should relinquish ownership of anything created in viewDidLoad that can be recreated.
- (void)viewDidUnload {
    self.eventsArray = nil;
    self.locationManager = nil;
    self.addButton = nil;
}

Add the Navigation Bar to the top of the view

  • Open the Story Board in the Project Navigator
  • Select the FirstView
  • Drag a Navigation Bar to the top of the view from the Object library
  • Drag a Bar Button Item to the left side of the Navigation Bar and set the Identifier to Edit
  • Drag a Bar Button Item to the right side of the Navigation Bar and set the Identifier to Add

Configuring the Application Delegate

The application delegate is responsible for creating and configuring the root view controller and a navigation controller to contain it.

Add the Navigation Controller Property

    • In the application delegate’s header file (AppDelegate.h), before the @interface section add an instance variable:
      UINavigationController *navigationController;
    • Add the property declaration:
      @property (nonatomic, retain) UINavigationController *navigationController;

 

Implement the Application Delegate

In the application delegate’s implementation file (AppDelegate.m):

  • Before the @implementation block of the application delegate class, import the RootViewController class’s header file:
    #import "RootViewController.h"
  • In the @implementation block of the application delegate class, synthesize the navigation controller property:
    @synthesize navigationController;

     

  • Replace your application delegate’s application:didFinishLaunchingWithOptions: method with the following implementation:
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
        RootViewController *rootViewController = [[RootViewController alloc]
        initWithStyle:UITableViewStylePlain];
    
        NSManagedObjectContext *context = [self managedObjectContext];
        if (!context) {
            // Handle the error.
        }
        // Pass the managed object context to the view controller.
        rootViewController.managedObjectContext = context;
    
        UINavigationController *aNavigationController = [[UINavigationController alloc]
        initWithRootViewController:rootViewController];
        self.navigationController = aNavigationController;
    
        [window addSubview:[navigationController view]];
        [window makeKeyAndVisible];
    
        return YES;
    }

Apple Objective-C programming fundamentals. Working with Dates

When you need to display date and time on your app’s screen you need an easy way to convert NSDate objects to NSString objects. Objective-C  contains methods to do the conversion, but the syntax is not simple. It is much easier to create a method that does the conversion and call that in a central place.

Create a method to convert NSDate objects to NSString using the current date format of the device.

Add a new class to the project

  • Click the + sign in the lower left corner of the Project Navigator
  • Select New File… in the pop-up menu
  • Select IOS -> Cocoa Touch -> Objective-C class
  • Click the Next button
  • Enter CommonMenthods into the Class field
  • Select NSObject in the Subclass of list
  • Click the Next button
  • Click the Create button to save the file in the project folder

Add three method signatures to the CommonMethods class

  • Open the CommonMethods.h file
  • Insert the following code into the @interface section
    + (NSString *)getDateShortString:(NSDate *)date;
    + (NSString *)getTimeShortString:(NSDate *)date;
    + (NSString *)getDateAndTimeShortString:(NSDate *)date;
    
    

Add the three methods to the implementation file

  • Open the CommonMethods.m file
  • Insert the following code into the@implementation section of the file
    // Returns the short date as a string
    + (NSString *)getDateShortString:(NSDate *)date {
        
        NSString *stringFromDate = [NSDateFormatter localizedStringFromDate:date
                                                                  dateStyle:NSDateFormatterShortStyle
                                                                  timeStyle:NSDateFormatterNoStyle];
        
        return stringFromDate;
    }
    
    // Returns the short time as a string
    + (NSString *)getTimeShortString:(NSDate *)date {
        
        NSString *stringFromDate = [NSDateFormatter localizedStringFromDate:date
                                                                  dateStyle:NSDateFormatterNoStyle
                                                                  timeStyle:NSDateFormatterShortStyle];
        
        return stringFromDate;
    }
    
    
    // Returns the short date and time as a string
    + (NSString *)getDateAndTimeShortString:(NSDate *)date {
        
        NSString *stringFromDate = [NSDateFormatter localizedStringFromDate:date
                                                                  dateStyle:NSDateFormatterShortStyle
                                                                  timeStyle:NSDateFormatterShortStyle];
        
        return stringFromDate;
    }
    

To use the new methods

Make the methods available in the class

  • Import the CommonMethods.h file into the class where you want to use the method
  • Insert the following line under the existing #import statement
    #import "lpCommonMethods.h"

Call the methods

  • Use the following syntax to display the date and time in short format set by the user
    self.startDateLabel.text = [CommonMethods getDateAndTimeShortString:self.startDate];

    where
    startDateLabel is a label on the view
    startDate is the NSDate object

Apple Objective-C programming fundamentals. Creating Segues in the Storyboard

Segue types

Segues are connections between views, so one view can call the other when the user pushes a button, or any specific object.

The Modal Segue

When the two views do not need to share information, like a login screen

The Push Segue

The push segue can pass data between the views and handle memory. This type of segue is needed for the navigation controller and tab bar controller.

 

Creating a Modal Segue

Add a button to the first view that will open the second view

  • In Xcode open the Storyboard of your application
  • Open the Utilities View in the upper right corner of the screen and select the Object libraryxcode object library
  • Drag a Text Field to the first view
  • Drag a Round Rect Button to the first view and enter Open Second Page as the title
    xcode first page

Add a new view to the Storyboard

  • From the Object library drag a View Controller to the storyboard
  • Drag a Text Field from the Object library to the second view
  • Drag a Round Rect Button from the Object library to the second view and enter Back to First Page to the title
    xcode second page

Create the segue between the views

  • Press the Control button on the keyboard and drag from the button on first view to the new view controller and release the control key and the mouse button
    xcode create segue
  • In the popup select modal
    xcode modal segue

 

Add the Text field to the interface of the first view

  • Open the ViewController.h of the new view in the Assistant Editor
  • Press the Control button and drag from the text field to the @interface section of the ViewController.h file
  • In the popup type firstTextField to the Name field and click the Connect button
    xcode first text field interface

Add the button to the interface of the first view

  • Press the Control key on the keyboard and drag the button from the first view to the @interface section of the ViewController.h file. Set the 
    • Connection to Action
    • Name to showSecondView: (including the colon)
    • Click the Connect button
      xcode first button interface

Create a a UIViewController class for the new View Controller

  • In the lower left corner of the project navigator click the plus sign (+)
  • Select New File... from the popup menu
  • On the popup window select Objective-C Class under IOS Cocoa Touch
  • Click the Next button
  • Set the name of the class to SecondViewController
  • Set the “Subclass of” to UIViewController
  • Click the Create button to place the new class into the project folder

Connect the new class to the View

  • Open the Storyboard and select the new view
  • In the Identity Inspector elect SecondViewController in the Class list

 

Add the Text field to the interface of the second view

  • Open the SecondViewController.h of the new view in the Assistant Editor
  • Press the Control button and drag from the text field to the @interface section of the SecondViewController.h file
  • In the popup type secondTextField to the Name field and click the Connect button
    xcode second text field interface

Add the button to the interface of the second view

  • Press the Control key on the keyboard and drag the button from the second view to the @interface section of the SecondViewController.h file. Set the
    • Connection to Action
    • Name to returnToFirstView: (including the colon)
    • Click the Connect button
      xcode second button interface

Apple Objective-C programming fundamentals – Part 1 – The language.

To write an application for an Apple device (iPhone, iPod, iPadn, Macintosh) Apple recommends the Ojbective-C language. Xcode, the Apple development environment (IDE) supports the usage of Objective-C. This article summarizes the basics of Objective-C for beginners of that language. It is helpful if you already have some programming experience, otherwise some terms will require additional research or learning.

The following is based on the Apple document:

http://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOS/chapters/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html

File extensions

.h Header files. Header files contain class, type, function, and constant declarations.
.m Implementation files. A file with this extension can contain both Objective-C and C code. It is sometimes called a source file.
.mm Implementation files. An implementation file with this extension can contain C++ code in addition to Objective-C and C code. Use this extension only if you actually refer to C++ classes or features from your Objective-C code.

To import all the header files of a framework

To import all the header files of a framework import the umbrella header file of the framework. The umbrella header file has the same name as the framework:

#import <MySDK/MySDK.h>

Class definition

Declare the class in the .h file

// Declare the class
@interface MyClass : NSObject
{
// Member variables, visible only within the class
    int       count;
    id        data;
    NSString* name;
}
// Public method declarations visible from outside of the class

// Instance method type (-)
- (id)initWithString: (NSString*) aName;

// Class method type (+)
+ (MyClass*)createMyClassWithString (NSString*) aName;
@end

Place the class implementation in the .m file

// Import the .h header file that declares the public interface
@import "MyClass.h"
// Implement the the class
@implementation MyClass

// Instance method (-). You have to create an instance of the class to execute this method.
- (id)initWithString: (NSString*) aName;
{
    // The code of the method
}

// Class method (+). You don't have to create an instance of the class to execute this method.  
+ (MyClass*)createMyClassWithString (NSString*) aName;
{
    // The code of the method
}
@end

Variables

MyClass *myObject1; // Static variable (the data type is specified)
id myObject2; // Dynamic type variable (it can hold any data type)
NSString *myObject3; // Static type string

Put an asterisk (*) in front of the name of the statically typed variables to indicate that those are pointers. The id type implies a pointer, so no asterisk is needed.

Methods and messaging

When you create an application, one of the most important rules is: never type the same code twice. Of course you can use copy and paste, but that is not the point. If you have to type the same line or lines multiple times, it usually makes sense to place the repeated lines in a method at one place, and just call that method from wherever it is necessary. Using this technique if you have to change the lines for any reason in the future you only have to change it at one place and the effect will be visible everywhere it is called from.

method_declaration

This method’s actual name is insertObject:atIndex: , the concatenation of all signature keywords, and the colon (:) indicates the existence of the parameters. If the method has no parameters, you can omit the colon(:)

Calling a method

In this example we will send the anObject and 0 to the insertObject:atIndex: method of the myArray object

[myArray insertObject:anObject atIndex:0];

The brackets ( [ and ] ) enclose the message expression.

You can nest message expressions to provide objects and arguments to the message expression. In the next example the mArray object and the anObject will be returned by nested message expressions:

[[myAppObject theArray] insertObject:[myAppObject objectToInsert] atIndex:0];

You can use dot notation to invoke accessor methods. The prior example would look like this with dot notation to access theArray and objectToInsert of myAppObject.

[myAppObject.theArray insertObject:myAppObject.objectToInsert atIndex:0];

You can use dot notation for assignment:

myAppObject.theArray = aNewArray;

You can use the dot notation for static type objects only. You cannot use the dot notation to reference dynamically typed objects (id type).

Class methods

Class methods are defined with the plus (+) sign, and can be called without creating an instance of the class.

The following example illustrates how you use a class method as a factory method for a class. In this case, the array method is a class method on the NSArray class—and inherited by NSMutableArray—that allocates and initializes a new instance of the class and returns it to your code.

NSMutableArray *myArray = nil;  // nil is essentially the same as NULL
// Create a new array and assign it to the myArray variable.
myArray = [NSMutableArray array];

Properties and Accessor Methods

Accessor methods set and get the values of properties

Declare public properties in the @interface section of the header file, private properties in the .m source file.

Define the userName string property:

@property (nonatomic, copy) NSString *c;

The compiler automatically creates ( synthesizes ) the _userName private instance variable to store the value of the property.

It also generates two accessor methods to set and get the value of the property.

The getter method’s name mathches the  name of the property: userName

The setter method’s name is setUserName (where the first letter of the property name is capitalized)

There are options the you can use during property declaration

@property (copy) MyModelObject *theObject;  // Copy the object during assignment.
@property (readonly) NSView *rootView;      // Declare only a getter method.
@property (weak) id delegate;               // Declare delegate as a weak reference

To specify the name of the instance variable:

@synthesize enabled = _isEnabled;

To specify the name of the getter accessor method:

@property (assign, getter=isEnabled) BOOL enabled; // Assign new value, change name of getter method

Blocks

Use blocks to be able to call methods a simpler way. Blocks hide the complexity of method calls, and provide simple interfaces over complex lines of code.

blocks

You can call this block with the following code:

int result = myBlock(4); // result is 28

The block has read only access to methods, properties, global, and instance variables in the context it is defined. To grant write access to variables declare them with the __block modifier.

Protocols and Categories

In Objective-C a class can inherit from one parent class only, but using protocols and categories you can implement methods in your class defined in multiple places without inheriting from multiple classes.

Protocols

When you add a protocol to the definition of a class the new class will be able to implement the methods of the protocol. This way multiple classes can implement the same protocol and a class can implement multiple protocols without inheriting from multiple classes.

For example to “teach” the  HelloWorldViewController to behave like the UITextFieldDelegate protocol, include the name of the protocol in angle brackets ( < … > ) when you declare the class.

@interface HelloWorldViewController : UIViewController <UITextFieldDelegate> {

Protocol declarations look similar to class declarations, but protocols do not have a parent class and they do not define instance variables, but can have properties and methods. Protocols can define both required and optional methods. The following lines define a protocol with one instance method:

@protocol MyProtocol
 - (void)myProtocolMethod;
 @end

Categories

By referencing categories in the class definition you can also implement functionality in your class without inheriting from other classes. A category provides the way to group related method declarations within the header file.

The following line references a category in the class declaration on parentheses ().

@interface NSDate (NSDateCreation)

Class extension

A class extension is a place to declare private methods and properties in the implementation (.m) file. The class extension uses a special anonymous category (nothing between the parentheses).

@interface MyAppDelegate ()
    @property (strong) MyDataObject *data;
@end

Reserved terms

self Refers to the current object. Equivalent to this in C++
super Refers to the super class (the ancestor of the current class)
To invoke a method implemented by the current class
[self doSomeWork];

To invoke a property accessor in the current class

NSString *theName = self.name;

Defined types

Type Description and literal
id The dynamic object type. The negative literal for both dynamically and statically typed objects is nil.
Class The dynamic class type. Its negative literal is Nil.
SEL The data type (typedef) of a selector; this data type represents a method signature at runtime. Its negative literal is NULL.
BOOL A Boolean type. The literal values are YES and NO.

Checking for null values

NSDate *dateOfHire = [employee dateOfHire];
if (dateOfHire != nil) {
    // The dateOfHire is not null
// handle this case }

or

NSDate *dateOfHire = [employee dateOfHire];
if (dateOfHire) {
    // The dateOfHire is not null
    // handle this case
}

or if you do not need a reference to the object

if ([employee dateOfHire]) {
    // handle this case
}

Testing boolean values

BOOL equal = [objectA isEqual:objectB];
if (equal == YES) {
    // handle this case
}

Using the Apple Xcode development environment

View two files side-by-side

  • Open the Project Navigator
  • Click the first file in the Navigator
  • Option-Click the second file in the Navigator

The two files are displayed next to each other, so you can compare them and copy code between them.

Using tabs

In the Apple Xcode IDE you can use tabs to quickly switch between documents.

It looks like tabs are not the native way to open documents, because opening documents in tabs is not so intuitive.  To open a document in a new tab:

  • In the View menu select Show Tab Bar. This will show an empty bar for the tabs.
  • In the File menu select New -> Tab. The currently open document appears again in the new tab.
  • To open another document in a new tab
    • In the File menu select New -> Tab. The same, currently selected document opens third times in the new tab.
    • Select a new document in the project navigator for the new tab.

The positive side of this is that the multiple instances of the same document are synchronized, so a change in one instance is instantly reflected in the other instances.

 

 Using multiple windows

The advantage of this setup is to be able to configure the separate Xcode windows differently, for example one for code editing, the other for graphical view design.

  • In the File menu select New -> Window

Set up debugging

With the default settings in Xcode if there is an error in your app the user interface does not display the line where the error occurred. You can instruct Xcode to stop the execution on the line of code that will cause an error:

  • In the Debug menu select Breakpoints -> Create Exception Breakpoint… 

Xcode creates a new breakpoint called All Exceptions. When an exception (error) happens in your application Xcode will stop on the line that caused it.

Debug your app in the iOS Simulator or on your Apple device

  • Open the …ViewController.m on the project navigator
  • Find the self.label.text = greeting; statement close to the end of the file
  • Click the gutter (the wider light gray area) on the left side to place a break point

xcode breakpoint

  • Select the iPhone Simulator scheme next to the Stop button on the top of the screen
  • Click the Run button to execute the application in the iOS simulator
  • In the simulator enter your name in the text field
  • Click the Done button on the virtual keyboard
  • Click the Hello button on the simulator screen
  • The program execution will stop at the break point and show the selected line in the code editor

To remove the break point click and drag it away from the gutter

Accessing the Xcode Help

  • Control click anywhere in the code editor
  • In the pop- up context menu one of the last items is the Source Editor Help

xcode source editor help

Monitor the performance of your app

  • Start Xcode and open your project
  • In the Product menu select Perform Action -> Profile Without Building
  • The Profile window opens
  • On the left side select All to see all available tools
  • For example to test for memory leaks select the Leaks template and click Profile
  • Use the application in the simulator to provide data for the profiler
  • In the iOS Simulator menu select Quit iOS Simulator to close the simulator
  • The Allocations option on the left side shows the memory allocation history during the execution

Manage versions of your app

Xcode can create snapshots to store multiple versions of your app in case you make a modification that stops your app working, or you accidentally delete your source code

To manually create a snapshot

  • In the File menu select Create Snapshot
  • Enter a name for the snapshot, so later you can find it

To see the snapshots

  • Open the Organizer in the upper right corner of the screen
  • Click the Project button on the top of the window

xcode snapshots

Xcode also supports the Git and Subversion source control management systems (SCM) to coordinate work among multiple developers.

Create an iPhone, iPod or iPad app – Part 4 – Deploy the app to an Apple device

In the prior parts of the series we have created a simple iOS application and tested it in the iOS Simulator. The real gratification comes when we can see our own app on a real device, an iPhone, iPod or iPad. In this article we will deploy the app to an Apple device.

Get an Apple Developer account

You have to apply for a developer account to be able to deploy your app to an Apple device. The subscription fee is $99 + tax per year.

To open a developer account go to developer.apple.com

Once you receive the iOS Developer Program activation code via email you are ready to deploy the app to a real device.

The email contains an activation code, that is also a link to activate your account. Once you activated the account wait 5 minutes before trying to set up your device in Xcode. The Apple system needs some time to recognize the account activation.

Set up your Apple device

  • Start Xcode
  • Unlock your Apple device with the pass code
  • Connect the Apple device to the Macintosh computer
  • Open the Device organizer by clicking the Organizer button in the upper right corner of the Xcode screen
  • Select the device on the left side
  • Click the Use for Development button in the middle of the screen
    If the button is not visible click the Add to Portal button at the bottom of the screen

xcode registerdevice before

  • Enter your Apple Id and password that you used to register as an Apple developer
  • Xcode will offer you to generate security certificates, allow the application to do that
  • At the end of the certification generation process save the certificates on your computer, so you will be able to carry them to another Mac to develop on that machine too.
  • Close Xcode to force the application to get the latest certificate information from the Apple Developer web site

Deploy the application on the Apple device

  • Unlock your Apple device with the pass code
  • Connect the Apple device to the Macintosh computer
  • Start Xcode and open the project you want to deploy to the device
  • In the Product menu select Scheme -> Edit Scheme… to open the scheme editor
  • Select your device in the Destination pop-up menu

xcode launch app on device

  • Click OK to close the schema editor
  • Click the Run button in the upper right corner of the screen

You may get the following error message:

Code Signing Error. A valid provisioning profile matching the application’s Identifier … could not be found

Follow the steps in the answer at http://stackoverflow.com/questions/16155613/a-valid-provisioning-profile-matching-the-applications-identifier-could-not-be

  • A new icon appears on the screen of your Apple device. Tap it, now you can run your brand new application on your own device!

Create an iPhone, iPod or iPad app – Part 3 – Make it work

In this article we will make our application work. We already created a simple application and added a Text field, a Label and a Button to the view. We created connections between the user interface elements and the View Controller.

To make more room to work, close the Utilities area by clicking the Utilities button in the View group in the upper right corner of the screen or in the View -> Utilities menu click Hide Utilities

Create a Property to store your name

To be able to work with the data entered into the text field we have to create a property to store it and make it available for other processes. The property is a placeholder where we store values.

  • In the project navigator on the left side of the screen select the …ViewController.h
  • Before the @end statement write the following:
    @property (copy, nonatomic) NSString *userName;

You can copy the text into the editor, but if you choose to type it, Xcode will help you to complete the words. Just hit Return to accept the suggestions.

xcode inline suggestion

As you continue to type Xcode will show selection lists to help you. Use the arrow keys to select the appropriate item and press Return.

xcode completion list

Make the button work

In the previous article, Part 2,we already connected the button to the controller, now we will tell the controller what to do when the user clicks the button.

    • In the project navigator on the left side of the screen select the …ViewController.m item
    • Scroll down to the bottom to see the implementation of the changeGreeting: method at the end of the @implementation section
    • Add lines to the method, it should look like the text below. The first and last lines (the method definition and the closing bracket) are already there, to overwrite them copy the text below, select the first and last line in the editor and replace them with the full text.
- (IBAction)changeGreeting:(id)sender {

    self.userName = self.textField.text;

    NSString *nameString = self.userName;
    if ([nameString length] == 0) {
        nameString = @"World";
    }
    NSString *greeting = [[NSString alloc] initWithFormat:@"Hello, %@!", nameString];
    self.label.text = greeting;
}

You can run your app now to make sure all parts are correct, but it is not done yet.

  • Click the button on the simulated screen and  “Hello, World!” should appear in the the label.
  • If you click the text field you can enter letters there, but there is no way yet to close the automatically appearing keyboard

Make the keyboard disappear

The text field cannot close the keyboard, but it can ask the View Controller to act in behalf of it, so we will delegate the work to the View Controller

  • Stop the simulator by clicking the Stop button in the upper right corner of the screen

Teach the View Controller what to do

  • Select the …ViewController.m in the project navigator on the left side of the screen
  • At the bottom of the file before the @end statement enter the following. The easiest way to to this is to copy and paste the code.
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
    if (theTextField == self.textField) {
        [theTextField resignFirstResponder];
    }
    return YES;
}

In the method the resignFirstResponder instruction will close the keyboard.

Set up the View Controller to work on behalf of the text field

  • In the project navigator select the …ViewController.h item
  • To the end of the @interface line add the following:  <UITextFieldDelegate>The line should look like this:
    @interface HelloWorldViewController : UIViewController <UITextFieldDelegate>

    If there is already something between the < and > signs, just add ,UITextFieldDelegate starting with a comma (,) between the < and > signs.

 

Test your application

  • Click the Run button in the upper right corner of the screen

The application should behave as you expect it:

  • When you click the text field the keyboard appears
  • When you enter your name the letters show up in the text field
  • When you click the Done button on the keyboard the keyboard disappears
  • When you click the button on the screen “Hello, your name” appears in the label

Congratulations, you just created your first working iPhone, iPod, iPad app!

Create an iPhone, iPod or iPad app – Part 2 – Adding User Interface elements

Add user interface elements to the view

  • Open the MainStoryboard.storyboard file in the project navigator
  • Open the Utilities area by clicking the right most view button in the upper right corner of the screen
  • In the Library selector bar of the Utilities area select the object library

xcode object library

  • From the list drag a Text Field, a Label, and a Button  to the view

xcode adding text field

  • When you drag the UI elements on the canvas blue alignment guides appear to help you to align the elements on the view

xcode moving text field

  • To resize the UI elements drag the white squares at the middle of the sides or in the corners

xcode resize handles

  • The blue alignment guides also help you to set the proper size

xcode extending text field

Set the attributes of the User Interface elements

  • If necessary open the Attributes inspector by clicking the Attributes icon in the Inspector selector bar

xcode inspector attributes

  • Select the text field and enter the description of the text field in the Placeholder field of the Attributes inspector
  • With the Alignment attribute you can align the text to left, center or right

xcode text field attributes

  • To specify how the text field will be used, specify scroll down to the bottom of the Text Field area and set
    • Capitalization to Words
    • Correction to No
    • Keyboard to Default
    • Appearance to Default
    • Return key to Done

 

To add an action to a button

  • Hide the Utilities area by clicking the right most View button in the upper right corner of the screen
  • Open the Assistant area by clicking the xcode assistant editor button Assistant Editor button in the upper right corner of the screen
  • Make sure that the Assistant displays the view controller’s implementation file (that is, ...ViewController.m). If it shows ...ViewController.h instead, click the ...ViewController.h text above the editor area and select ...ViewController.m
  • Press the Control key on the keyboard and drag the button to the @interface section of the …ViewController.m editor

xcode dragging for action

 

  • When you release the Control key a pop-over appears

xcode action popover

  • In the Connection pop-up menu select Actionhe
  • In the Name field enter changeGreeting:  and finish the word with a colon(:)
  • Leave the Type field as id
  • Leave the Event pop-up menu as Touch Up Inside
  • Make sure the Arguments pop-up menu displays Sender
  • Click the Connect button to close the dialog

A few new lines of code appears in the …ViewController.m file with a gray filled circle on the left to indicate that a connection has been made between the button and the Controller

xcode action connection made

To get the user input from a text field create an Outlet

Control drag the text field to the @interface area of the …ViewController.m file

xcode dragging for outlet

In the pop-over set the following values

xcode configure text field outlet

  • Make sure the Connection contains Outlet
  • In the Name field type textField
  • Make sure the Type contains UITextField
  • Make sure the Storage is set to Weak
  • Click the Connect button to close the pop-over

To display the result in a label create an Outlet for the label

  • Control drag the label to the @interface section of the @…ViewController.m file
  • Make sure that the Connection pop-up menu contains Outlet.
  • In the Name field, type label
  • Make sure that the Type field contains UILabel
  • Make sure that the Storage pop-up menu contains Weak
  • In the popover, click Connect.

To view the connections you just created

  •  Click the Standard editor button to close the assistant editor and switch to the standard editor view. The Standard editor button is the leftmost Editor button and it looks like this: xcode standard editor button
  • Click the Utilities view button to open the utilities area.
  • Select the View Controller in the outline view.
  • Show the Connections inspector in the utilities area. The Connections inspector button is the rightmost button in the inspector selector bar, and it looks like this: xcode connections inspector button

xcode verify connections

Specify the View Controller as the delegate object for the text field to close the keyboard when the user clicks the Done button

  •  Make sure the MainStoryboard.storyboard is selected in the project navigator on the left side of the screen
  • Control drag the text field to the bottom of the canvas onto the yellow sphere that represents the View Controller
  • When you release the Control key you will see this

xcode tex field delegate

  • Select delegate in the Outlets section of the pop-over

To add accessibility hint to the text field, so the Apple VoiceOver screen reader can help people with visual disability

  •  Select the storyboard file in the project navigator on the left side of the screen
  • Select the text field

xcode type accessibility hint

  •  In the upper right corner select the Utilities view button
  • In the Inspector bar select the Identity inspector button
  • Enter the hint in the Accessibility section

Create an iPhone, iPod or iPad app – Part 1 – Getting started

As of the writing of this article to create iOS apps for iPhone, iPod and iPad you need a Macintosh computer with the Lion (Mac OS X 10.7),  Mountain Lion (Mac OS X 10.8) or later operating system.

Check the hardware requirements of Lion and Mountain Lion if you need to upgrade you computer from Snow Leopard (Mac OS X 10.6) or earlier, because Mountain Lion only runs on newer models with aluminum housing. If you have an earlier model with black or white housing from 2008 upgrading to Lion can be your solution. My black MacBook with the serial number ending with UMoP2 can only be upgraded to Lion.

To see the serial number of your Mac

  • Click the Apple icon in the upper right corner of the screen
  • Select About This Mac
  • On the popup window double click the word Version under the Mac OS X text

To deploy your app to any Apple device or submit it to the Apple App Store  you need to register as a developer at developer.apple.com and pay $99 plus tax a year membership fee.

To test the app on your Macintosh in an iOS simulator you don’t need the developer account, just download Xcode, the Apple development environment for free. This way you can decide without paying anything if you are interested in the Apple iOS app development.

In this series of articles we will use Xcode, the Apple development platform to create, test and deploy our applications.

To get Xcode

  • Start the Mac App Store application in your Mac
  • Download Xcode, the Apple IDE for iOS and Mac software development

The first steps

  • Start Xcode
  • On the Welcome page click Create a new Xcode project
  • To create an iOS application for iPhone, iPod or iPad click Application under iOS on the left side
  • Select the application type you want to develop
    • To create a simple one page application select Single View Application
  • Enter the name and other parameters of the application
    • Enter your initials for the class prefix to create a unique set of classes
  • Create a folder for the application in the Documents folder of your computer and save the project in that folder

xcode workspace

Set the initial view (the view that opens when the app starts)

In this example you can skip this if you selected the Single View Application, but later when you create apps with multiple views this will be the way to select the view that loads when the app starts.

  • Open the storyboard file
    • In the project navigator on the left side of the screen click the MainStoryBoard_iPhone.storyboard item

xcode storyboard

 

  • In the middle pane select the Controller you want to handle the initial view
  • To display the Utilities pane click the right View button in the upper right corner
  • To display the Attributes click the Attributes icon in the Inspector selector bar

xcode inspector attributes

  • In the View Controller section click the Initial Scene check box

xcode initial scene option

Set the background color of the view

  • In the middle of the screen select the view you want to modify
  • Open the Attributes inspector as described above
  • In the Attributes inspector set the background color

xcode background color button

To open the color wheel to select from all possible colors select Other in the Background drop down list

xcode color wheel

Run the application in the iOS Simulator

  • Select the device you want to simulate in the Scheme pop-up menu on the top of the screen next to the Stop button
  • Click the Run button to compile and run your app
  • The simulator does not have a stop button, but you can close it in the iOS Simulator menu.