iOS Platform Development - Intermediate

Day 4

Todays Goals

    • Learn about UIActivityViewController

    • Learn about UIImagePickerController

    • Learn about Gesture Recognizers

    Lets Review!

    Part 3

    Download the code:

    Implementing Protocol in PuppyListViewController

    • In order for PuppyListViewController to respond to the NewPuppyViewControllerDelegate we must implement it's required protocol methods...

    Assign the delegate

    • In order for PuppyListViewController to respond to the NewPuppyViewControllerDelegate protocol, we must assign the class (self) as the delegate when we perform the modal segue

    Run your app to see if your 
    PuppyListViewController view is now in control of the NewPuppyViewController

    Saving New Puppy Data

    • Switch back to NewPuppyViewController...
    • When a user id finished entering information, we need to add a new Puppy object to the pups array so we can show it in the table view

      Implement the new delegate method in PuppyListViewController

      • This adds the new Puppy object to the array of pups
      • Then inserts a new table cell at the bottom of the table
      • We could have just done [self.tableView reloadData] but it looks nicer to insert the new row with an animation
        • UITableViewRowAnimationAutomatic automatically picks the proper animation, depending on where you insert the new row. 


      • Lets include a way for our users to select an image to go with the new puppy information when adding a puppy to the list.
      • Add a Image View to the bottom of your table...

      User Interaction Enabled

      Must be set for gestures to work on a UIImageView

      UIImageView IBOutlet

      Add a new property to NewPuppyViewController in the form of an IBOutlet

       @property (weak, nonatomic) IBOutlet UIImageView *imageView;

      Gesture Recognizers

      • Add a tap gesture recognizer to the image view you just created
      • This will allow us to create an IBAction when the cell is tapped

        Gesture Recognizers

        • Right click and drag the gesture icon in the bottom bar into the PuppyListViewController class to create a new IBAction

        Don't forget to implement the UIImagePickerControllerDelegate & UINavigationControllerDelegate protocols!

        UIImagePickerControllerDelegate Methods

        Save the image!

        Update the done IBAction to assign the chosen image to the photo property in the Puppy model

        Update PuppyDetailViewController

        Now your selected image will display with your puppy details!


        • Lets us publish our new content to other services within our app!
         - (IBAction)Share:(id)sender
            NSArray *activityItems = @[[NSString stringWithFormat:@"Checkout my favorite puppy, %@!",],];
            UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
            activityController.excludedActivityTypes =  @[UIActivityTypePostToWeibo];
            [activityController setValue:[NSString stringWithFormat:@"Checkout my favorite puppy, %@!",] forKey:@"subject"];
            [self presentViewController:activityController animated:YES completion:nil];
        • Don't forget to connect the Share IBAction to a navigation button bar item

        Implementing Age & Popularity

        • Tapping the Age & Popularity rows in the Add Puppy screen should open a new screen that lets the user pick an age or popularity from a list
          • Drag a new Table View Controller into the storyboard
          • Select the Age table view cell in the Add Puppy screen and ctrl-drag (or right click-drag) to the new Table View Controller to create a segue between them
          • Make this a Push segue (under Selection Segue in the popup, not Accessory Action) and give it the identifier PickAge
          • Follow the same steps for the popularity cell and give it a segue identifier of PickPopularity

        Try it!

        Customize TableView

        • Set the new TableViews navigation title to "Choose Detail"
        • Change the prototype cell style to "Basic"


        • Like always, we need to now add a new class for our new view...

        • Be sure to add a BOOL property that we can use in our class to know if the user selected to see the age options (didSelectAge) or selected to see the popularity options (!didSelectAge)
        • Delete all of the pre populated methods in the .m file

        Implement viewDidLoad

        The options property is what will hold our list of options to display in the table view...

        Implement UITableView Delegate Methods

        Don't forget to set the reuse identifier for the cell in the storyboard!

        This would also be a good time to make sure you set the view's custom class to "NewPuppyDetailViewController"

        Don't forget to prepareForSegue!

        In NewPuppyViewController...

        Be sure to set didSelectAge if the user selected the Age 


        Add the following protocol to NewPuppyDetailViewController

        Add a delegate protocol with just one method, and a property that will hold the name of the currently selected option.

        The name of the selected option will be set in self.option. Here you figure out what the index is for that option in the list of options. You’ll use that index to set a checkmark in the table view cell. 

        Update cellForRowAtIndexPath

        This sets a checkmark on the cell that contains the name of the currently selected option. 

        • First this deselects the row after it was tapped. 
        • Then it removes the checkmark from the cell that was previously selected, and puts it on the row that was just tapped. 
        • Finally, the method returns the name of the chosen option to the delegate.

        Update NewPuppyViewController

        Create two new properties to store the users age and popularity options

        Update viewDidLoad

        Set default values for the age and popularity fields when the view loads

        Don't forget to update prepareForSegue

        We need to make sure we are passing right detail information to NewPuppyDetailViewController

        Retrieve the selected options

        Implement the NewPuppyDetailViewControllerDelegate method inside of NewPuppyViewController

        Assign the selected values to their appropriate properties

        Add the new Puppy to the model

        Remember that newPuppyViewController: didAddPuppy is a delegate method of the NewPuppyViewControllerDelegate protocol

        Thank you!

        Made with