You are on page 1of 29

iPad   iPhone   iPod  touch        

   

 iOS    

                 

Development  
By  Dani  Arnaout      

[  Twitter:  dani_arnaout]   [Skype:  dani_arnaout]   [Email:  dani.arnaout@live.com]   [Youtube  channel:  programmingtutor0]  

             

Version  1.0  

Table  of  Contents:  
  Page  3:  UILabel     Page  4:  UIButton     Page  4:  UISegmentedControl     Page  5:  UITextField   Page  5:  UISlider   Page  5:  UISwitch   Page  6:  UIActivityMonitor   Page  6:  UIProgressBar   Page  7:  UIPageControl   Page  9:  UIStepper   Page  10:  UITableView   Page  12:  UIImageView   Page  12:  UITextView   Page  13:  UIWebView   Page  13:  MKMapKit   Page  15:  UIDatePicker     Page  16:  UITapGestureRecognizer   Page  17:  UIPinchGestureRecognizer   Page  17:  UIRotationGestureRecognizer   Page  17:  UISwipeGestureRecognizer   Page  17:  UIPanGestureRecognizer   Page  17:  UILongPressGestureRecognizer     Page  18:  NSTimer   Page  18:  UIAlertView   Page  19:  UIActionSheet     Page  20:  Audio   Page  21:  Recording   Page  24:  Mail  Composer   Page  24:  Auto-­‐Method  Call   Page  24:  Animation   Page  25:  Data  Persistence   Page  29:  Substrings   Page  29:  Storyboard        

 
  2  

hidden  =  YES.5.  UILabel:     • text:         (The  following  examples  apply  to  a  UILabel  called  myLabel)     The  text  displayed  by  the  label.     • font   The  font  of  the  text.       • backgroundColor   The  color  of  the  text.backgroundColor=[UIColor  redColor].     [myLabel  setFont:[UIFont  fontWithName:@"Arial"  size:18]].     myLabel.     • alfa   Set  the  alfa  of  the  text.     [label  setTextAlignment:UITextAlignmentLeft].     Mylabel.textColor=[UIColor  blueColor].I.alfa  =  0.text  =  @”Text”.     also:  UITextAlignmentRight    UITextAlignmentCenter     • textColor   The  color  of  the  text.   (This  applies  to  all  other  UI  elements  too)     • hidden   Hide  or  show  the  text.       myLabel.     myLabel.     • textAlignment   The  technique  to  use  for  aligning  the  text.     myLabel.   (This  applies  to  all  other  UI  elements  too)         3   .

font   The  font  of  the  button’s  title.     • titleLabel.backgroundColor=[UIColor  redColor].     also:  UIControlStateHighlighted    UIControlStateDisabled    UIControlStateSelected       • setTitleColor:  forState:   The  color  of  the  button’s  title.selectedSegmentIndex  ==0)    NSLog(@"HI").     • setBackgroundImage:  forState:   The  image  of  the  button’s  background.     myLabel.     set  images  for  states:   [button  setImage:[UIImage  imageNamed:@"normal.     myButton.titleLabel.png"]   forState:UIControlStateNormal].     [myButton  setTitleColor:[UIColor  BlueColor]   forState:UIControlStateSelected].  UISegmentedControl:     (The  following  examples  apply  to  a  UISegmentedControl  called  mySegmentedControl)   if  (mySegmentedControl.II.     III.  UIButton:     (The  following  examples  apply  to  a  UIButton  called  myButton)       • setTitle:  forState:   The  title  used  for  specified  state.font  =  [UIFont  fontWithName:@"Arial"  size:18].png"]   forState:UIControlStateHighlighted].       4   .   [button  setImage:[UIImage  imageNamed:@"pressed.     [myButton  setTitle:@”hello”  forState:UIControlStateNormal].

    VI. myTextField.     also:   UITextFieldViewModeNever   UITextFieldViewModeWhileEditing   UITextFieldViewModeUnlessEditing     Bool  Attributes:     myTextField.hidden.h  file  then  implement   using  the  following  code  .     mySlider.isEditing.       IV.  UISwitch:     (The  following  examples  apply  to  a  UISwitch  called  mySwitch)   if (mySwitch.clearButtonMode  =  UITextFieldViewModeAlways.on == YES) NSLog(@”Switch is ON”).minimumValue  =  0.placeholder=@"Enter  your  name".     myTextField.0.   mySlider.text=@"hi".            myTextField.maximumValue  =  100.   5   .            myTextField.   myTextField.       V.mySlider.h  file  then  implement  using   the  following  code  .hasText.value].highlighted.  UISlider:     (The  following  examples  apply  to  a  UISlider  called  mySlider)     • Creating  a  slider:   Connect  an  instance  of  UISlider  to  .  UITextField:     (The  following  examples  apply  to  a  UITextField  called  myTextField)     • Using  a  text  field:   Connect  an  instance  of  UITextField  to  .0.             NSString  *sliderValue  =  [NSString  stringWithFormat:@"%f".            myTextField.

isAnimating)  NSLog(@"It  is  animating").  UIActivityIndicator:     (The  following  examples  apply  to  a  UIActivityIndicator  called  myActivityIndicator)   start  animating:   [myActivityIndicator  startAnimating].     also  available:  UIActivityIndicatorViewStyleWhiteLarge.                                   6   .     Change  its  style:   myActivityIndicator.  UIProgressView:     (The  following  examples  apply  to  a  UIProgressView  called  myProgressView)   set  progress  value:   [myProgressView  setProgress:1.0  animated:YES].           UIActivityIndicatorViewStyleGrey.       VII.     get  the  value  of  the  progressView  and  save  it  in  a       float  a=  myProgressView.progress.     Stop  animating:   [myActivityIndicator  stopAnimating].   VIII.activityIndicatorViewStyle  =   UIActivityIndicatorViewStyleWhite.     Check  if  it’s  animating:   if  (myActivityIndicator.

height  =  image.     @end     Add  this  to  your  .   [scrollView  setCanCancelContentTouches:NO].}   UIImageView  *imageView  =  [[UIImageView  alloc]  initWithImage:image].size.   CGRect  rect  =  imageView.     /*  internal  */   -­‐  (void)setupPage.   rect.   scrollView.   rect.  nimages++)  {   NSString  *imageName  =  [NSString  stringWithFormat:@"image%d.delegate  =  self.clipsToBounds  =  YES.m     -­‐  (void)setupPage   {   scrollView.  UIPageControl:     Add  this  to  your  .     [self.       scrollView.indicatorStyle  =  UIScrollViewIndicatorStyleWhite.pagingEnabled  =  YES.   }   @property  (retain.size.     @property  (retain.     /*  for  pageControl  */   -­‐  (IBAction)changePage:(id)sender.  nonatomic)  IBOutlet  UIPageControl  *pageControl.   if  (image  ==  nil)  {         break.     VIII.jpg".scrollEnabled  =  YES.   for  (.scrollView  setBackgroundColor:[UIColor  blackColor]].  nonatomic)  IBOutlet  UIScrollView  *scrollView.   UIImage  *image  =  [UIImage  imageNamed:imageName].h     @interface  ScrollingViewController  :  UIViewController   <UIScrollViewDelegate>   {          BOOL  pageControlIsChangingPage.     7   .frame.  .   CGFloat  cx  =  0.   scrollView.width  =  image.       NSUInteger  nimages  =  0.height.size.   scrollView.  (nimages   +  1)].size.width.

size.          }       /*      *   We  switch  page  at  50%  across      */   CGFloat  pageWidth  =  _scrollView.frame.frame.          frame.width.   imageView.width  -­‐  image.          pageControl.currentPage.   rect.x  =  ((scrollView.height)].   }     -­‐  (void)scrollViewDidScroll:(UIScrollView  *)_scrollView   {          if  (pageControlIsChangingPage)  {                  return.width.size.origin.size.currentPage  =  page.origin.   scrollViewDidEndDecelerating  will  turn  this  off      */          pageControlIsChangingPage  =  YES.x  -­‐  pageWidth  /  2)  /   pageWidth)  +  1.   int  page  =  floor((_scrollView.  [scrollView   bounds].   cx  +=  scrollView.width  *  pageControl.numberOfPages  =  nimages.frame.     /*      *   When  the  animated  scrolling  finishings.rect.          [scrollView  scrollRectToVisible:frame  animated:YES].height)  /  2).origin.origin.   }   @end     8   .pageControl.size.contentOffset.height  -­‐  image.frame.size.y  =  ((scrollView.   }     -­‐  (void)scrollViewDidEndDecelerating:(UIScrollView  *)_scrollView     {          pageControlIsChangingPage  =  NO.size.     }   self.frame.   [scrollView  setContentSize:CGSizeMake(cx.size.width)  /  2)  +   cx.y  =  0.   [imageView  release].   [scrollView  addSubview:imageView].   }     #pragma  mark  -­‐   #pragma  mark  PageControl  stuff   -­‐  (IBAction)changePage:(id)sender     {     /*   Change  the  scroll  view*/          CGRect  frame  =  scrollView.frame  =  rect.size.x  =  frame.          frame.

 &  Step  values  for  your  stepper  from  the   properties  menu.     //  To  change  the  increment  value  for  each  step      //  (default  is  1)      [myStepper  setStepValue:10].value].   IX.       To  get  the  value  of  myStepper:   myStepper.  Max.(int)myStepper.value  (return  type  :  DOUBLE)     To  get  the  value  in  the  form  of  a  string:   NSString  *hi  =  [NSString  stringWithFormat:@"%i".     //  Set  current  value   [myStepper  Value:0].h  file  then  implement  using   the  following  code  .  UIStepper:       (The  following  examples  apply  to  a  UIStepper  called  myStepper)       • Using  a  stepper:   Connect  an  instance  of  UIStepper  to  .                                     9   .     You  can  set  Current.  Min.      [myStepper  setMaximumValue:99].       //  Set  min  and  max      [myStepper  setMinimumValue:0].

@"three".h  file:   @interface  tables  :  UITableViewController     {  NSArray  *myList.          if  (cell  ==  nil)  {    cell  =  [[UITableViewCell  alloc]  initWithStyle:UITableViewCellStyleDefault   reuseIdentifier:CellIdentifier].     -­‐  (NSInteger)tableView:(UITableView  *)tableView   numberOfRowsInSection:(NSInteger)section   {   //  Return  the  number  of  rows  in  the  section.   }     c)Assigning  the  array  elements  as  the  row  cells  titles       -­‐  (UITableViewCell  *)tableView:(UITableView  *)tableView   cellForRowAtIndexPath:(NSIndexPath  *)indexPath   {   static  NSString  *CellIdentifier  =  @"Cell".             UITableViewCell  *cell  =  [tableView   dequeueReusableCellWithIdentifier:CellIdentifier].}     @end   3) Initialize  the  array  in  the  your  viewDidLoad:   myList  =  [NSArray  arrayWithObjects:@"one".@"two".   }       b)  number  of  rows  in  each  section  (we  calculate  the  elements  of  the  array   by  using  a  ready  method).          return  cell.  UITableViews:   How  to  create  a  static  table:   1)  Create  a  view  that  sublasses  from  UITableView  (you  will  get  extra  methods   ready  for  you  to  implement)   2) Create  a  global  Array  in  .   X.text  =  [myList  objectAtIndex:[indexPath  row]].          return  [myList  count].     4) We  have  to  implement  three  methods   a)number  of  sections  (usually  1)       -­‐  (NSInteger)numberOfSectionsInTableView:(UITableView  *)tableView   {   //  Return  the  number  of  sections.nil].textLabel.          return  1.     10   .          }          cell.

  -­‐  (BOOL)tableView:(UITableView  *)tableView   canEditRowAtIndexPath:(NSIndexPath  *)indexPath   {          //  Return  NO  if  you  do  not  want  the  specified  item  to  be  editable.   }   */     /*   //  Override  to  support  editing  the  table  view.}     TABLE  VIEWS:  EXTRA  HELPFUL  METHODS:     /*   //  Override  to  support  conditional  editing  of  the  table  view.          return  YES.  and  add  a  new  row  to  the  table  view          }         }   */     /*   //  Override  to  support  rearranging  the  table  view.   -­‐  (void)tableView:(UITableView  *)tableView  moveRowAtIndexPath:(NSIndexPath   *)fromIndexPath  toIndexPath:(NSIndexPath  *)toIndexPath   {   }   */     /*   //  Override  to  support  conditional  rearranging  of  the  table  view.   -­‐  (BOOL)tableView:(UITableView  *)tableView   canMoveRowAtIndexPath:(NSIndexPath  *)indexPath   {          //  Return  NO  if  you  do  not  want  the  item  to  be  re-­‐orderable.  insert  it  into   the  array.   }   */     11   .          return  YES.   -­‐  (void)tableView:(UITableView  *)tableView   commitEditingStyle:(UITableViewCellEditingStyle)editingStyle   forRowAtIndexPath:(NSIndexPath  *)indexPath   {          if  (editingStyle  ==  UITableViewCellEditingStyleDelete)  {                  //  Delete  the  row  from  the  data  source                  [tableView  deleteRowsAtIndexPaths:[NSArray   arrayWithObject:indexPath]  withRowAnimation:UITableViewRowAnimationFade].          }                else  if  (editingStyle  ==  UITableViewCellEditingStyleInsert)  {                  //  Create  a  new  instance  of  the  appropriate  class.

navigationController  pushViewController:detailViewController   animated:YES].  So  if   the  text  is  too  large  for  the  screen.  UITextView:     (The  following  examples  apply  to  a  UITextView  called  myTextView)        myTextView.       XII..            //  Pass  the  selected  object  to  the  new  view  controller.        myTextView.  UIImageView:     (The  following  examples  apply  to  a  UIImageView  called  myImage)   make  sure  you  use  .image  =  [UIImage  imageNamed:@"image1"].          /*            <#DetailViewController#>  *detailViewController  =   [[<#DetailViewController#>  alloc]  initWithNibName:@"<#Nib  name#>"   bundle:nil].            */   }           XI..  Create  and  push  another  view   controller.       (This  is  used  for  multiple  lines  of  text  with  scrollable  ability.png  images   myImage.text  =  @"HI".   #pragma  mark  -­‐  Table  view  delegate     -­‐  (void)tableView:(UITableView  *)tableView   didSelectRowAtIndexPath:(NSIndexPath  *)indexPath   {          //  Navigation  logic  may  go  here.editable  =  NO.  you  can  scroll  down  to  get  some  more   space  for  a  new  text)                   12   .            [self.            //  .

         newRegion.  UIWebView:   (The  following  examples  apply  to  a  UIWebView  called  myWebView)   • Displaying  a  web  page:   Connect  an  instance  of  UIWebView  to  .URL.002411.mapType=  MKMapTypeSatellite.span.latitude  =  33.outerHTML"].h  file  then  implement  using   the  following  code  .lb"].          coordinate.          newRegion.          coordinate.longitude  =  35.  MKMapView:   •    (The  following  examples  apply  to  a  MKMapView  called  mapView)   Displaying  a  map:   Import  the  Map  framework.     NSURLRequest  *req  =  [NSURLRequest  requestWithURL:url].   //Get  source  code  of  the  page:   NSString *source = [webView stringByEvaluatingJavaScriptFromString: @"document.     13   • .bau.466281.675435.mapView  setRegion:newRegion  animated:YES].   XIII.     Placing  a  pin  on  the  map:   //Create  coordinate  then  assign  it  to  a  pin   CLLocationCoordinate2D  coordinate.request.466281.h  file  then  implement  using   the  following  code  .span.center.edu.longitude  =  35.center.     NSURL  *url  =  [NSURL  URLWithString:@"http://www.          newRegion.675435.absoluteString.     //Display  the  create  ‘newRegion’  on  the  view        [self.004576.     XIV.h>     //Create  region  (Get  coordinated  from  Google  Maps)          mapView.          newRegion.       //GET  URL  FROM  WEBVIEW:   NSString *currentURL= myWebView.latitudeDelta  =  0.getElementsByTagName('html')[0].longitudeDelta  =  0.h  file:   #import  <MapKit/MapKit.latitude  =  33.   Add  the  following  line  to  your  .          MKCoordinateRegion  newRegion.     [webView  loadRequest:req].   Connect  an  instance  of  MKMapView  to  .

google.rightCalloutAccessoryView  =  rightButton.canShowCallout  =  YES.   //Place  pin  on  the  map   [self.   }       //IMPLEMENT  THIS  ONE  (WHEN  DISCLOSURE  BUTTON  IS  PRESSED):   -­‐  (void)mapView:(MKMapView  *)mapView  annotationView:(MKAnnotationView  *)view   calloutAccessoryControlTapped:(UIControl  *)control{              //    myLabel.pinColor  =  MKPinAnnotationColorRed.animatesDrop  =  YES.                  pinView.                  pinView.                  pinView.           //Create  Pin   MKPointAnnotation  *annotation  =  [[MKPointAnnotation  alloc]  init].          }  else  {                  pinView.     //Assign  the  coordinates  we’ve  created  to  the  pin          [annotation  setCoordinate:coordinate].                                    UIButton  *rightButton  =  [UIButton   buttonWithType:UIButtonTypeDetailDisclosure].          if  (!pinView)  {                  pinView  =  [[MKPinAnnotationView  alloc]  initWithAnnotation:annotation   reuseIdentifier:@"pinView"].text=@"hi".mapView  addAnnotation:annotation].se"]].   • Disclosure  button  beside  the  pin’s  title:   -­‐  (MKAnnotationView  *)mapView:(MKMapView  *)mapView  viewForAnnotation:(id   <MKAnnotation>)annotation  {          MKPinAnnotationView  *pinView  =  (MKPinAnnotationView  *)[mapView   dequeueReusableAnnotationViewWithIdentifier:@"pinView"].   }                       14   .   [[UIApplication sharedApplication] openURL:[NSURL URLWithString: @"http://www.annotation  =  annotation.                  pinView.          }          return  pinView.   //Give  the  pin  a  title          [annotation  setTitle:@"My  Pin"].

       UIDatePickerModeDateAndTime.        UIDatePickerModeCountDownTimer              //To  set  a  specific  format  for  a  date          NSDateFormatter  *format  =  [[NSDateFormatter  alloc]  init].datePickerMode  =  UIDatePickerModeDate.            //  To  set  the  datePicker  to  a  specific  date          [myDatePicker  setDate:date  animated:YES].                    UIDatePickerModeTime.XV.          //      To  get  date  with  specified  format          NSString  *dateString  =  [format  stringFromDate:date].     To  find  the  difference  between  two  dates:   NSTimeInterval  interval  =  [endDay  timeIntervalSinceDate:startDay].                                                 15   .  UIDatePicker:     (The  following  examples  apply  to  a  UIDatePicker  called  myDatePicker)     myDatePicker.          [format  setDateFormat:@"MM-­‐dd-­‐yyyy"].          //      To  create  a  date  from  string  with  specified  format:          NSDate  *date  =  [format  dateFromString:@"1-­‐1-­‐2011"].        UIDatePickerModeDate.

view.  you  have  to  follow  the  following  steps:   1) Drag  an  instance  of  your  gesture  recognizer  from  the  library  and   place  it  on  top  of  your  object  receiving  the  gesture.center  =  CGPointMake(recognizer.         The  following  are  the  different  methods  to  handle  all  recognizers   types.state  ==  UIGestureRecognizerStateEnded)  {              CGPoint  velocity  =  [recognizer  velocityInView:self.y  *   velocity.   2) Make  sure  that  your  object  is  both  user  interaction  and  multi  touch   enabled.   .          CGFloat  magnitude  =  sqrtf((velocity.  slideMult).                                                                                      recognizer.y)).  GestureRecognizer:     Types  of  gestures:   UITapGestureRecognizer   UIRotationGestureRecognizer   UIPanGestureRecognizer   UISwipeGestureRecognizer   UIPinchGestureRecognizer     To  create  any  kind  of  gestures.m  file.  (declare  in  .y  +   translation.  0)  inView:self.XVI.view].   4) Control  drag  from  your  recognizer  to  the  MainViewController  in  the   left  side  panel.  and  choose  the  appropriate  method  (usually  called   selector).center.view.  magnitude.center.view.   3) Add  the  following  code  in  .view].                     16   .view].m)     -­‐  (IBAction)handlePan:(UIPanGestureRecognizer  *)recognizer  {              CGPoint  translation  =  [recognizer  translationInView:self.       }     TOP  STOP  SMOOTHLY  WITH  DECREASING  VELOCITY  ADD  THIS:     if  (recognizer.  slideMult:  %f".x  *  velocity.y).          NSLog(@"magnitude:  %f.h  &  implement  in  .          CGFloat  slideMult  =  magnitude  /  200.x.          recognizer.x  +   translation.x)  +  (velocity.(IBAction)handlePan:(UIPanGestureRecognizer  *)recognizer.h  file  and  implement  it  in  the  .          [recognizer  setTranslation:CGPointMake(0.

view.          finalPoint.          recognizer.  and  for  each  gesture  recognizer   connect  its  delegate  outlet  to  the  view  controller.              [UIView  animateWithDuration:slideFactor*2  delay:0   options:UIViewAnimationOptionCurveEaseOut  animations:^{                  recognizer.          finalPoint.view.       17   .  0).transform.x.  recognizer.y  +   (velocity.width).size.transform  =   CGAffineTransformScale(recognizer.scale).  float  slideFactor  =  0.bounds.view.h  and  mark  the  class  as  implementing   UIGestureRecognizerDelegate  as  shown  below:   @interface  ViewController  :  UIViewController  <UIGestureRecognizerDelegate>   Then  switch  to  ViewController.y  *  slideFactor)).  0).1  *  slideMult.       }     PINCH:     -­‐  (IBAction)handlePinch:(UIPinchGestureRecognizer  *)recognizer  {                  recognizer.rotation  =  0.          recognizer.x  *  slideFactor).view.rotation).bounds.view.view.   }   Next.y  =  MIN(MAX(finalPoint.view.x  +   (velocity.  //  Increase  for  more  of  a  slide          CGPoint  finalPoint  =  CGPointMake(recognizer.center.          }  completion:nil].center  =  finalPoint.  self.   self.y.  open  MainStoryboard.           }         Rotate:     -­‐  (IBAction)handleRotate:(UIRotationGestureRecognizer  *)recognizer  {                  recognizer.transform  =   CGAffineTransformRotate(recognizer.  recognizer.center.           }     Simultaneous  Gesture  Recognizers   Open  up  ViewController.height).   recognizer.storyboard.scale  =  1.view.transform.scale.                                                                              recognizer.view.size.x  =  MIN(MAX(finalPoint.m  and  implement  one  of  the  optional  methods   you  can  override:   -­‐  (BOOL)gestureRecognizer:(UIGestureRecognizer  *)gestureRecognizer    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer  *)   otherGestureRecognizer  {                          return  YES.

 NSTimer:     -­‐  (IBAction)startTimer:(id)sender  {          NSTimer    *timer.          timer=  [NSTimer  scheduledTimerWithTimeInterval:0.            [alert  show].         Dismissing  alert  with  a  forced  selected  index  (0  for  cancel)   [myAlert  dismissWithClickedButtonIndex:0  animated:NO].  UIAlertView:     (The  following  examples  apply  to  a  UIAlertView  called  alert)       Creating  and  displaying  an  alert:   • Include  this  code  inside  a  specific  method  to  trigger  this  alert   on  the  screen  .   }     -­‐(void)  moreprogress{          //  Set  whatever  you  want  to  executed  each  interval  of  time   }         XVIII.     UIAlertView  *alert  =  [[UIAlertView  alloc]  initWithTitle:@”Hi”                                                                                  message:@”This  is  a  msg”                                                                                  delegate:self                                                                                  cancelButtonTitle:@"OK"                                                                                  otherButtonTitles:  nil].   }                 18   .       Executing  some  code  depending  on  the  user  choice:    -­‐  (void)alertView:(UIAlertView  *)alertView   clickedButtonAtIndex:(NSInteger)buttonIndex  {  NSLog([NSString   stringWithFormat:@“%d”.1  target:self   selector:@selector(moreprogress)  userInfo:nil  repeats:YES  ].XVI.  buttonIndex]).

nil].                  case  1:                          NSLog(@"Second  choice  pressed").          }   }                       19   .             [actionSheet  showInView:self.XIX.                  case  3:                          NSLog(@"cancel  button  pressed").  UIActionSheet:     add  this  to  the  .                          break.view].                          break.@"Third  choice".                          break.                          break.h  :     @interface  MainViewController  :  UIViewController  <UIActionSheetDelegate>  )     -­‐  (IBAction)hehe:(id)sender  {          UIActionSheet  *actionSheet  =  [[UIActionSheet  alloc]   initWithTitle:@"This  is  an  action  sheet"   delegate:self   cancelButtonTitle:@"Cancel"   destructiveButtonTitle:@"Predicted  answer"   otherButtonTitles:@"Second  choice".                  case  2:                          NSLog(@"Third  choice  pressed").       //  What  to  do  after  the  user  selects  an  option     -­‐  (void)  actionSheet:  (UIActionSheet  *)actionSheet   didDismissWithButtonIndex:(NSInteger)buttonIndex{          switch  (buttonIndex)  {                  case  0:                          NSLog(@"Predicted  answer  pressed").                                            default:                          break.

}                           20   .localizedDescription).chompPlayer = [self loadWav:@"mySong"].  Audio:   To play an audio file: Insert audio framework first.(AVAudioPlayer *)loadWav:(NSString *)filename { NSURL * url = [[NSBundle mainBundle] URLForResource:filename withExtension:@"wav"].chompPlayer play].h: #import <AVFoundation/AVFoundation.(void)viewDidLoad { [super viewDidLoad]. url. Add this to your .XX. if (!player) { NSLog(@"Error loading %@: %@". NSError * error. } else { [player prepareToPlay]. error. Add this to your . } return player. self. } . AVAudioPlayer * player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error].m: .h> @property (strong) AVAudioPlayer * chompPlayer. [self.

         UIButton  *stopButton.h>     @interface  recordViewController  :  UIViewController   <AVAudioRecorderDelegate.enabled  =  NO.   -­‐(IBAction)  recordAudio.          AVAudioPlayer  *audioPlayer.  retain)  IBOutlet  UIButton  *playButton.   -­‐(IBAction)  playAudio.enabled  =  YES.                    if  (audioRecorder.enabled  =  YES.enabled  =  NO.enabled  =  YES.          UIButton  *playButton.recording)          {                  playButton.   -­‐(IBAction)  stop.                  stopButton.  Recording:     Add  this  to  your  .recording)          {                  [audioRecorder  stop].  AVAudioPlayerDelegate>   {          AVAudioRecorder  *audioRecorder.h:   #import  <UIKit/UIKit.  retain)  IBOutlet  UIButton  *recordButton.          UIButton  *recordButton.h>   #import  <AVFoundation/AVFoundation.XXI.playing)  {                  [audioPlayer  stop].   }   @property  (nonatomic.          }  else  if  (audioPlayer.   @property  (nonatomic.m:   -­‐(void)  recordAudio   {          if  (!audioRecorder.   @property  (nonatomic.          }   }   -­‐(void)  playAudio   {     21   .          }   }   -­‐(void)stop   {          stopButton.          recordButton.  retain)  IBOutlet  UIButton  *stopButton.   @end       Add  this  to  your  .                  [audioRecorder  record].          playButton.

       if  (!audioRecorder.   typically  from  a  nib.enabled  =  YES.   }   //  Implement  viewDidLoad  to  do  additional  setup  after  loading  the  view.          }   }     -­‐(void)audioPlayerDidFinishPlaying:   (AVAudioPlayer  *)player  successfully:(BOOL)flag   {          recordButton.                                        [error  localizedDescription]).delegate  =  self.   }   -­‐(void)audioPlayerDecodeErrorDidOccur:   (AVAudioPlayer  *)player                                                                    error:(NSError  *)error   {          NSLog(@"Decode  Error  occurred").                  recordButton.enabled  =  NO.                                    if  (audioPlayer)                          [audioPlayer  release].enabled  =  NO.url                                                                                error:&error].                  else                          [audioPlayer  play].   -­‐  (void)viewDidLoad     22   .   }   -­‐(void)audioRecorderDidFinishRecording:   (AVAudioRecorder  *)recorder                                                        successfully:(BOOL)flag   {   }   -­‐(void)audioRecorderEncodeErrorDidOccur:   (AVAudioRecorder  *)recorder                                                                        error:(NSError  *)error   {          NSLog(@"Encode  Error  occurred").recording)          {                  stopButton.                  NSError  *error.                                    audioPlayer.                                    audioPlayer  =  [[AVAudioPlayer  alloc]                                                  initWithContentsOfURL:audioRecorder.                                    if  (error)                          NSLog(@"Error:  %@".enabled  =  YES.          stopButton.

                                                                           AVSampleRateKey.                    NSArray  *dirPaths.enabled  =  NO.                                                                          nil].          NSString  *soundFilePath  =  [docsDir                                                                 stringByAppendingPathComponent:@"sound.          playButton.          NSString  *docsDir.                    if  (error)          {                  NSLog(@"error:  %@".                            }  else  {                  [audioRecorder  prepareToRecord].                                                                          [NSNumber  numberWithInt:16].                    dirPaths  =  NSSearchPathForDirectoriesInDomains(                                                                                                        NSDocumentDirectory.enabled  =  NO.                                                                          [NSNumber  numberWithInt:  2].                                                                          [NSNumber  numberWithFloat:44100.  [error  localizedDescription]).          docsDir  =  [dirPaths  objectAtIndex:0].{          [super  viewDidLoad].                    NSDictionary  *recordSettings  =  [NSDictionary                                                                            dictionaryWithObjectsAndKeys:                                                                          [NSNumber   numberWithInt:AVAudioQualityMin].                    NSError  *error  =  nil.                                                                          AVEncoderAudioQualityKey.                                                                            AVEncoderBitRateKey.                    NSURL  *soundFileURL  =  [NSURL  fileURLWithPath:soundFilePath].caf"].                                                                            AVNumberOfChannelsKey.  YES).   NSUserDomainMask.          }   }           23   .                    audioRecorder  =  [[AVAudioRecorder  alloc]                                            initWithURL:soundFileURL                                            settings:recordSettings                                            error:&error].          stopButton.0].

m:     -­‐  (IBAction)openMail:(id)sender  {          MFMailComposeViewController  *picker  =  [[MFMailComposeViewController   alloc]  init].  MAIL  COMPOSER:     MailComposerViewController.     picker.XXII.     @end     MailComposerViewController.      [UIView  setAnimationDuration:0.h>     @interface  MailComposerViewController  :  UIViewController   <MFMailComposeViewControllerDelegate>       -­‐(IBAction)openMail:(id)sender.mailComposeDelegate  =  self.  Animation:        [UIView  beginAnimations:nil  context:nil].  Auto-­‐Method  Call:     In  seconds:   [self performSelector:@selector(myMethodName) withObject:nil afterDelay:2.h>   #import  <MessageUI/MessageUI.     24   .   }         XXIII.h:     #import  <UIKit/UIKit.   // here you can implement whatever you want to be animated:    [UIView  commitAnimations].   }     //  Used  to  dismiss  the  mailComposer  when  cancel  is  pressed   -­‐  (void)mailComposeController:(MFMailComposeViewController*)controller   didFinishWithResult:(MFMailComposeResult)result  error:(NSError*)error     {            [self  dismissModalViewControllerAnimated:YES].     XXIV.2].          [self  presentModalViewController:picker  animated:YES].0f].h>   #import  <MessageUI/MFMailComposeViewController.

  }     function  call.       2)  DEALING  WITH  FILES:   //  will  be  available  in  the  next  update  J                                         25   .   NSString  *myNewString  =  [self  retrieveString].XXV.     b)  RETRIEVING:   -­‐(NSString*)retrieveString   {   NSString*  recoveredString  =  [[NSUserDefaults  standardUserDefaults]   objectForKey:@"String"].             }     Calling  the  function:   [self  saveString:@”hello  this  is  a  string”].   return  recoveredString.  Data-­‐Persistence:     1)  Key/Value  way:     a)  SAVING:   -­‐(void)saveString:(NSString*)myString   {   [[NSUserDefaults  standardUserDefaults]  setObject:myString   forKey:@"String"].

 nonatomic)  IBOutlet  UITextField  *address.h>   #import  "sqlite3.  nonatomic)  IBOutlet  UILabel  *status.          sqlite3  *contactDB.   @property  (retain.  nonatomic)  IBOutlet  UITextField  *phone.  YES).3)  DATABSE:   Database  is  a  big  subject  to  talk  about  in  just  few  pages.          NSArray  *dirPaths.h  from  your  framework  menu     Add  this  to  your  .              NSFileManager  *filemgr  =  [NSFileManager  defaultManager].   NSUserDomainMask.  nonatomic)  IBOutlet  UITextField  *name.h:     #import  <UIKit/UIKit.                    docsDir  =  [dirPaths  objectAtIndex:0].   @property  (retain.     After  that  u’ll  know  how  to  add  items  and  search  for  them.m:   -­‐  (void)viewDidLoad   {          NSString  *docsDir.   }   @property  (retain.   @property  (retain.             if  ([filemgr  fileExistsAtPath:  databasePath  ]  ==  NO)          {   const  char  *dbpath  =  [databasePath  UTF8String].       Add  sqlite3.     @end     Add  this  to  your  .                                               26   .h"     @interface  ViewController  :  UIViewController  {          NSString  *databasePath.                    //  Build  the  path  to  the  database  file   databasePath  =  [[NSString  alloc]  initWithString:  [docsDir   stringByAppendingPathComponent:  @"contacts.db"]].  so  I’ll  be   leading  you  through  creating  a  database.                    //  Get  the  documents  directory    dirPaths  =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory.

 NAME  TEXT.          [super  viewDidLoad].                    if  (sqlite3_open(dbpath.  if  (sqlite3_open(dbpath.  NULL.  &contactDB)  ==  SQLITE_OK)          {                  NSString  *insertSQL  =  [NSString  stringWithFormat:  @"INSERT  INTO   CONTACTS  (name.                  }  else  {                          status.  phone.text.                          address.  NULL).  \"%@\")".  NULL.text  =  @"Contact  added".  phone)  VALUES  (\"%@\".   }   -­‐  (IBAction)saveData:(id)sender  {              [phone  resignFirstResponder].                          }                                                    sqlite3_close(contactDB).text  =  @"Failed  to  create  table".  sql_stmt.text  =  @"Failed  to  open/create  database".  insert_stmt.                                    const  char  *insert_stmt  =  [insertSQL  UTF8String].   name.  &errMsg)  !=   SQLITE_OK)                          {                                  status.                    const  char  *dbpath  =  [databasePath  UTF8String].                  if  (sqlite3_step(statement)  ==  SQLITE_DONE)                  {                          status.                  }          }              [filemgr  release].  &contactDB)  ==  SQLITE_OK)                  {                        char  *errMsg.          [address  resignFirstResponder].  address.                                            }  else  {                          status.  address.                          phone.text  =  @"".                          name.     //  Do  any  additional  setup  after  loading  the  view.                  }     27   .  \"%@\".text  =  @"".  ADDRESS  TEXT.text  =  @"".          [name  resignFirstResponder].                      const  char  *sql_stmt  =  "CREATE  TABLE  IF  NOT  EXISTS  CONTACTS  (ID   INTEGER  PRIMARY  KEY  AUTOINCREMENT.  &statement.text.  typically  from  a   nib.text  =  @"Failed  to  add  contact".                  sqlite3_stmt        *statement.text].  -­‐1.  PHONE  TEXT)".                                                    if  (sqlite3_exec(contactDB.              sqlite3_prepare_v2(contactDB.

                                 address.                                  phone.text  =  @"Match  found".                sqlite3_finalize(statement).  &contactDB)  ==  SQLITE_OK)          {                  NSString  *querySQL  =  [NSString  stringWithFormat:  @"SELECT  address.                                                                    status.text  =  phoneField.  NULL)  ==   SQLITE_OK)                  {                          if  (sqlite3_step(statement)  ==  SQLITE_ROW)                          {   NSString  *addressField  =  [[NSString  alloc]  initWithUTF8String:(const  char   *)  sqlite3_column_text(statement.          }     }             28   .  &statement.                                  phone.                                     NSString  *phoneField  =  [[NSString  alloc]  initWithUTF8String:(const  char  *)   sqlite3_column_text(statement.                                                                    [addressField  release].  0)].                  }                  sqlite3_close(contactDB).          sqlite3_stmt        *statement.                  sqlite3_close(contactDB).                          }                          sqlite3_finalize(statement).text  =  @"".  query_stmt.text  =  @"Match  not  found".                                    const  char  *query_stmt  =  [querySQL  UTF8String].text  =  @"".                                  address.   phone  FROM  contacts  WHERE  name=\"%@\"".  name.text  =  addressField.text].  1)].                                  [phoneField  release].                          }  else  {                                  status.                    if  (sqlite3_open(dbpath.                     if  (sqlite3_prepare_v2(contactDB.  -­‐1.          }     }     -­‐  (IBAction)findItem:(id)sender  {          const  char  *dbpath  =  [databasePath  UTF8String].

Go to the right side: identifier: hello 3. NSString *substring=@"my name".location != NSNotFound) { //Does contain the substring NSLog(@"Exists").   29   . NSRange textRange = [string rangeOfString:substring]. } StoryBoards: modals: 1. 2.m add the following line to the method that will be responsible for navigating to the second view [self performSegueWithIdentifier:@"hello" sender:self]. link between a view & another using MODAL way. In your .   SUBSTRING: NSString *string = @"hello my name is midresho". if(textRange.