SlideShare uma empresa Scribd logo
1 de 40
Baixar para ler offline
CS193p
                            Spring 2010




Wednesday, April 14, 2010
Announcements
                        Paul’s Office Hours
                        E-mail is best way to get help
                        Or in this room before and after Monday’s class


                        Sonali’s Office Hours Changed Again
                        Tuesday 10am to noon
                        Thursday 10am to noon


                        Andreas Taking Over Sonali’s Friday Time
                        Monday 6pm to 8pm
                        Friday 11am to 1pm




Wednesday, April 14, 2010
Homework
                        Submission Problems
                        Disk space was full, so half the class could not submit.
                        Make sure you delete your build directory before submitting.
                        Assignment 2 deadline moved to tonight at 11:59pm.
                        If it still fails, you can submit by e-mail this week.


                        Try to finish your Homework on Monday
                        There is no “new information” for homework in Monday’s lectures
                        In fact, Monday is “moving on to the next thing” day
                        Lots of “last minute” help on Monday (and now Tuesday morning)
                        Not so Tuesday night
                        Don’t be afraid to use e-mail to get help as well (but don’t depend
                        on getting a response to something sent Tuesday night on Tuesday).




Wednesday, April 14, 2010
Communication

                            E-mail
                            Questions are best sent to cs193p@cs.stanford.edu
                            Sending directly to instructor or TA’s risks slow response.


                            Web Site
                            Very Important!
                            http://cs193p.stanford.edu
                            All lectures, assignments, code, etc. will be there.
                            This site will be your best friend when it comes to getting info.




Wednesday, April 14, 2010
Today’s Topics
                            “Under the Hood” of “View-based Application”

                            Application Lifecycle

                            View Controller Lifecycle

                            UINavigationController

                            Demo Continuation




Wednesday, April 14, 2010
main()
                 Like any C application, your app starts here

                 Here’s the code from main.m (found in
                 Other Sources folder in Xcode window):
                 #import <UIKit/UIKit.h>

                 int main(int argc, char *argv[]) {

                            NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
                            int retVal = UIApplicationMain(argc, argv, nil, nil);
                            [pool release];
                            return retVal;
                 }




Wednesday, April 14, 2010
main()
             #import <UIKit/UIKit.h>

             int main(int argc, char *argv[]) {

                      NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
                      int retVal = UIApplicationMain(argc, argv, nil, nil);
                      [pool release];
                      return retVal;
             }
                   UIApplicationMain() creates a UIApplication object
                   (despite return value, it never returns).

                   The third argument is the name of the class of your UIApplication
                   (nil is the same as @”UIApplication”)

                   The fourth argument is the name of the class which will be your
                   UIApplication’s delegate (nil means “none,” but it’ going to get set via
                                                                        s
                   the application’s “MainWindow.xib” file--next slide).

                   We’ll talk about NSAutoreleasePool later (the one above does nothing).


Wednesday, April 14, 2010
UIApplication
                   What is this “application object” you speak of?
                   It is a shared object (singleton).
                   There is only ever one instance of it.
                   You can get ahold of it via ...
                   UIApplication *app = [UIApplication sharedApplication];

                   Has a lot of stuff you’ll never use
                   But here are a few of interest ...
                   @property BOOL networkActivityIndicatorVisible;
                   @property BOOL statusBarHidden;
                   @property UIStatusBarStyle statusBarStyle;

                   Other things that we’ll get into later



Wednesday, April 14, 2010
Application Lifecycle
                   Create UIApplication object
                   Application initializes itself
                   MainWindow.xib is loaded (delegate is usually set)
                   NSAutoreleasePool is created
                   Application waits for events to occur
                   Events are dispatched to your code
                   When done, screen is updated (drawRect: might be called)
                   NSAutoreleasePool is drained
                   Application waits for events to occur again
                   System asks application to terminate and it does


Wednesday, April 14, 2010
Autorelease Pools

                Pool




                                                                                                              Pool created
                          pp                                                             en
                                                                                           t                                     p
                    h
                        a                      zed                      nib             v               en
                                                                                                          t                 ap
             u nc                        itiali                   ain              fo re              ev                xit
        La                          in                     ad
                                                                m
                                                                                it                dle                  E
                                 pp                  L   o                    W
                                                                               a             H an
                               A

Wednesday, April 14, 2010
Autorelease Pools

                Pool                                                                                             Objects autoreleased
                                                                                                                  here go into pool




                                                                                                                   [object
                                                                                                                   autorelease];




                                                                                                              Pool created
                          pp                                                             en
                                                                                           t                                     p
                    h
                        a                      zed                      nib             v               en
                                                                                                          t                 ap
             u nc                        itiali                   ain              fo re              ev                xit
        La                          in                     ad
                                                                m
                                                                                it                dle                  E
                                 pp                  L   o                    W
                                                                               a             H an
                               A

Wednesday, April 14, 2010
Autorelease Pools

                Pool                                                                                             Objects autoreleased
                                                                                                                  here go into pool




                                                                                                              Pool created
                          pp                                                             en
                                                                                           t                                     p
                    h
                        a                      zed                      nib             v               en
                                                                                                          t                 ap
             u nc                        itiali                   ain              fo re              ev                xit
        La                          in                     ad
                                                                m
                                                                                it                dle                  E
                                 pp                  L   o                    W
                                                                               a             H an
                               A

Wednesday, April 14, 2010
Autorelease Pools
                                                            [object release];


                Pool                                        [object release];
                                                                                                                 Objects autoreleased
                                                                                                                  here go into pool



    [object release];
                                           Pool released




                                                                                                              Pool created
                          pp                                                             en
                                                                                           t                                     p
                    h
                        a                      zed                      nib             v               en
                                                                                                          t                 ap
             u nc                        itiali                   ain              fo re              ev                xit
        La                          in                     ad
                                                                m
                                                                                it                dle                  E
                                 pp                  L   o                    W
                                                                               a             H an
                               A

Wednesday, April 14, 2010
Autorelease Pools

                Pool                                                                                             Objects autoreleased
                                                                                                                  here go into pool




                                           Pool released




                                                                                                              Pool created
                          pp                                                             en
                                                                                           t                                     p
                    h
                        a                      zed                      nib             v               en
                                                                                                          t                 ap
             u nc                        itiali                   ain              fo re              ev                xit
        La                          in                     ad
                                                                m
                                                                                it                dle                  E
                                 pp                  L   o                    W
                                                                               a             H an
                               A

Wednesday, April 14, 2010
Application Lifecycle
                   Parts of the lifecycle you are involved in:
                   1. MainWindow.xib - you can edit it
                   2. Application Delegate - you can implement it
                   3. Event Handling and Drawing - you can implement

                   The rest is handled automatically for you
                   We covered #3 on Monday. Let’s look at #1 and #2 now.




Wednesday, April 14, 2010
MainWindow.xib
                Automatically loaded

                Contains      (what is usually the only)   UIWindow for your app

                Contains the Application Delegate
                (this is just an NSObject with it’s class set in the Identity Inspector in IB)
                The delegate implements the UIApplicationDelegate protocol
                All the methods in this protocol are optional


                Xcode creates a MainWindow.xib for you

                Xcode creates a template Application Delegate for you
                It calls it <YourApplicationName>AppDelegate.[mh]




Wednesday, April 14, 2010
MainWindow.xib
                If you choose “View-based Application” when you create your
                project, Xcode will create a View Controller in MainWindow.xib
                It will be called <YourApplicationName>ViewController.
                And its “NIB Name” property will be <YourApplicationName>ViewController.xib.

                The AppDelegate that Xcode creates will have outlets to the
                window and and to the View Controller in MainWindow.xib
                For example, here’s the AppDelegate Xcode created for Happiness:
                #import <UIKit/UIKit.h>

                @class HappinessViewController;

                @interface HappinessAppDelegate : NSObject <UIApplicationDelegate> {
                    UIWindow *window;
                    HappinessViewController *viewController;
                }

                @property (nonatomic, retain) IBOutlet UIWindow *window;
                @property (nonatomic, retain) IBOutlet HappinessViewController *viewController;

                @end

Wednesday, April 14, 2010
MainWindow.nib
                If you choose “Window-based Application” when you
                create your project, Xcode will only create the
                UIWindow (no View Controller) in MainWindow.xib

                We will do that today in our demo
                The AppDelegate will look like this (our demo app today is “Psychologist”):
                #import <UIKit/UIKit.h>

                @interface PsychologistAppDelegate : NSObject <UIApplicationDelegate> {
                    UIWindow *window;
                }

                @property (nonatomic, retain) IBOutlet UIWindow *window;

                @end




Wednesday, April 14, 2010
Application Delegate
                Application Delegate is involved in the entire lifecycle
                - (void)applicationDidFinishLaunching:
                - (void)applicationDidBecomeActive:
                - (BOOL)application:handleOpenURL:
                - (void)applicationDidReceiveMemoryWarning:
                - (void)applicationWillResignActive:
                - (void)applicationDidResignActive:
                - (void)application:willChangeStatusBarOrientation:duration:
                - (void)application:didChangeStatusBarOrientation:
                - (void)applicationWillTerminate:


                ... and more


Wednesday, April 14, 2010
Application Delegate
                applicationDidFinishLaunching:
                This is only called after MainWindow.xib is loaded.
                Note the property in UIViewController called view.
                All UIViewControllers have a view property which is their top-level view.
                It is either built in UIViewController’s loadView or from its .xib file.
                In this case, it is wired up to the top-level view in HappinessViewController.xib
                (not in MainWindow.xib).
                We simply add it as a subview of the main window below.
                @implementation HappinessAppDelegate

                @synthesize window;
                @synthesize viewController;

                - (void)applicationDidFinishLaunching:(UIApplication *)application {
                    // Override point for customization after app launch
                    [window addSubview:viewController.view];
                    [window makeKeyAndVisible];
                }

                - (void)dealloc {
                    [viewController release]; // this should be self.viewController = nil
                    [window release];         // this should be self.window = nil
                    [super dealloc];
                }

                @end

Wednesday, April 14, 2010
Application Delegate
                applicationWillTerminate:
                There is no way to stop the termination, you just have a chance to clean up.
                Don’t do anything that takes very long here!
                If you have a lot of data to write out or something, do as you go, not here.
                Here’s an example which writes out NSUserDefaults.
                @implementation HappinessAppDelegate

                - (void)applicationWillTerminate:(UIApplication *)application
                {
                    [[NSUserDefault standardUserDefaults] synchronize];
                }

                @end




Wednesday, April 14, 2010
Application Delegate
                applicationDidReceiveMemoryWarning:
                Now is the time to clean up big memory hogs:
                Image data
                Large data sets
                Sounds or other media
                Anything that can be reconstructed from a permanent store like disk

                View Controllers also receive a version of this, and they are even more
                likely to be able to do something about it than the Application Delegate
                so many times there is no implementation here at all.




Wednesday, April 14, 2010
View Controller
                   It’s an MVC Controller with a property pointing to its View
                   @property (nonatomic, retain) UIView *view;
                   Note that it retains its view, so you won’t have to.
                   We’ve seen that property as an outlet (and ignored it) in IB a few times.

                   It has a “lifecycle” too, which starts with creating it
                   Its designated initializer specifies .xib file to use
                   - (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
                   If nibBundle is nil, it gets it out of the Resources folder in Xcode.
                   Usually you just call init which looks for a .xib of the same name as class.
                   If there is no .xib, then you must subclass UIViewController and implement:
                   - (void)loadView
                   If you don’t use a .xib, this method MUST set the view property.
                   Don’t specify nibName and also implement loadView, it’s one or the other
                   (it’s undefined what it means to do both).




Wednesday, April 14, 2010
View Controller
                   Lifecycle continued ...
                   Once it is created, it sends viewDidLoad to itself
                   - (void)viewDidLoad
                   {
                            / set up properties and such of the view here
                             /
                            / but don’t start loading data or other expensive operations
                             /
                            view.someProperty = 35;
                   }


                   Just before it appears on screen, it sends
                   - (void)viewWillAppear:(BOOL)animated
                   {
                       [super viewWillAppear:animated]; / can be called anywhere in here
                                                         /
                            / kick off data loading now, but don’t block (use threads)
                             /
                            [self beginLoadingDataFromTheWeb];
                            / maybe set up UI to indicate data loading in progress
                             /
                   }


Wednesday, April 14, 2010
View Controller
                   Lifecycle continued ...
                   Just before it disappears from the screen
                   - (void)viewWillDisappear:(BOOL)animated
                   {
                            [super viewWillDisappear:animated]; / can be called anywhere in here
                                                                 /
                            / be nice to user in case they come back to this view
                             /
                            [self rememberScrollPosition];
                            / do other things that make sense now that we’re going away
                             /
                            [self saveDataToPermanentStore];
                            / again, be careful not to do anything time-consuming here
                             /
                   }


                   Also:
                   - (void)viewDidAppear:(BOOL)animated
                   - (void)viewDidDisappear:(BOOL)animated




Wednesday, April 14, 2010
View Controller
                   Lifecycle continued ...
                   If we are low on memory
                   - (void)viewDidUnload
                   {
                            self.outlet = nil; / release outlets so they can get deallocated
                                                /
                   }


                   By the time this is called, the view property is nil.
                   This almost never happens (i.e. when memory is low, this is rarely called).
                   There are bigger memory fish to fry.




Wednesday, April 14, 2010
View Controller
                   What else can a View Controller do?
                   It knows what container it is in
                   Might be in a Tab Bar or a Navigation Controller or a Split View, et. al.
                   @property (readonly) UINavigationController *navigationController;
                   @property (readonly) UITabBarController *tabBarController;
                   @property (readonly) UISplitViewController *splitViewController;

                   Might be being displayed modally by another View Controller
                   @property (readonly) UIViewController *modalViewController;


                   Can control whether it can be rotated by the user
                   - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)
                   By default, returns NO.
                   Return YES to any orientation your View is willing to support.
                   Other methods will notify you when rotation happens, e.g.
                   - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation) ...
                   - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)




Wednesday, April 14, 2010
View Controller
                   What else can a View Controller do?
                   Has a property which is an object which contains
                   all sorts of info about how to display the top bar
                   if the View Controller is in a UINavigationController
                   @property (readonly) UINavigationItem *navigationItem;

                   (note that it automatically creates one for you if it doesn’t exist,
                   that’s why it is a readonly property with no setter)

                   UINavigationItem has a lot of properties, e.g.
                   @property NSString *title;
                   @property UIBarButtonItem *leftBarButtonItem;
                   @property UIBarButtonItem *rightBarButtonItem;
                   @property UIView *titleView;   / replaces title with an arbitrary view
                                                   /

                   Lots of other stuff. Check out documentation.


Wednesday, April 14, 2010
Controllers of Controllers
                There are a handful of special kinds of
                UIViewControllers in UIKit.

                They are UIViewControllers whose view is an
                arrangement of the views of other UIViewControllers

                UINavigationController
                Hierarchical flow of views


                UITabBarController
                Independently tabbable views


                UISplitViewController
                Side-by-side master->detail view




Wednesday, April 14, 2010
UINavigationController
                Manages a “stack” of View Controllers

                The view belonging to the View Controller on the
                top of the stack is displayed

                What controls are in the top and bottom bar of the
                UINavigationController is also controlled by the
                View Controller on top of the stack

                When a selection of some sort is made in the top
                View Controller’s view, a new View Controller can be
                pushed onto the stack and become the new top

                There is always a “back” button in the upper left
                corner of the view for popping off the stack
                (i.e. going back)

Wednesday, April 14, 2010
UINavigationController’s Parts

                                      • view of the UIViewController which
                                       is currently on the top of the stack




Wednesday, April 14, 2010
UINavigationController’s Parts

                                      • view of the UIViewController which
                                       is currently on the top of the stack
                                      • title (an NSString property on
                                       UIViewController) of the one on top
                                       of the stack




Wednesday, April 14, 2010
UINavigationController’s Parts

                                      • view of the UIViewController which
                                       is currently on the top of the stack
                                      • title (an NSString property on
                                       UIViewController) of the one on top
                                       of the stack
                                      • title of the UIViewController which
                                       is next down on the stack




Wednesday, April 14, 2010
UINavigationController’s Parts

                                      • view of the UIViewController which
                                       is currently on the top of the stack
                                      • title (an NSString property on
                                       UIViewController) of the one on top
                                       of the stack
                                      • title of the UIViewController which
                                       is next down on the stack
                                      • toolbarItems (an NSArray of
                                       UIBarButtonItems) of the
                                       UIViewController which is on top of
                                       the stack




Wednesday, April 14, 2010
UINavigationController
                 Designated initializer is init
                 But there is a convenience initializer to start stack off
                 - initWithRootViewController:(UIViewController *)vc


                 Pushing UIViewControllers onto the stack
                 - (void)pushViewController:(UIViewController *)vc
                                   animated:(BOOL)animated

                 UIViewControllers     know which UINavigationController they are
                 in (if any), so it’s easy to push the next one on the stack from
                 the one that is currently on the stack
                 - (void)someAction:(UIButton *)sender
                 {
                     UIViewController *vcToPush = ...;
                            [self.navigationController pushViewController:vcToPush animated:YES];
                 }

                 By the way, animated is YES always except very first push

Wednesday, April 14, 2010
UINavigationController
                Notice that the space available for your view is
                smaller inside a UINavigationController (because of
                the bars on top and bottom)

                So make sure you have your autosizing set up
                properly in Interface Builder
                There are also methods in UIView to set autosizing




Wednesday, April 14, 2010
UINavigationController
                How you pass data between views on the stack is
                important

                Don’t use global variables
                Your Application Delegate is a global variable!


                So how to do it?
                Set up the data in a UIViewController before pushing it.
                Imagine you have an action method in the top VC on the stack (visible).
                - (void)someAction:(UIButton *)sender
                {
                        MoreDetailViewController *vcToPush = [self getVCToPush];
                        vcToPush.someProperty = ...;
                        vcToPush.otherProperty = ...;
                        [self.navigationController pushViewController:vcToPush animated:YES];
                }

                VCs on the stack should not have pointers to the VC that pushed them on.
Wednesday, April 14, 2010
UINavigationController
                If you absolutely need data from the VC that pushed
                you onto the stack, use a protocol to get it and have
                that pushing VC set itself as your delegate




Wednesday, April 14, 2010
Demo
                We’ll take a look at HappinessAppDelegate
                and MainWindow.nib

                Create a new project not using “View-based App.”

                We’ll reuse HappinessViewController and FaceView
                by dragging them into our new project

                Next we’ll create a new UIViewController which
                will push a HappinessViewController

                Finally, we’ll create a UINavigationController and
                call addSubview: with its view on our main window



Wednesday, April 14, 2010
Homework
                Creating a new project that is not “View-based”
                You’ll have to implement your own applicationDidFinishLaunching:


                Importing (reusing) code from another project
                You’ll reuse your CalculatorBrain and your CalculatorViewController


                Creating a custom view with its own drawRect:
                Creating a UIViewController
                Creating a UINavigationController
                Pushing a UIViewController in the context of a
                UINavigationController



Wednesday, April 14, 2010

Mais conteúdo relacionado

Destaque

Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Applitools
 

Destaque (20)

Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
 

Lecture 06

  • 1. CS193p Spring 2010 Wednesday, April 14, 2010
  • 2. Announcements Paul’s Office Hours E-mail is best way to get help Or in this room before and after Monday’s class Sonali’s Office Hours Changed Again Tuesday 10am to noon Thursday 10am to noon Andreas Taking Over Sonali’s Friday Time Monday 6pm to 8pm Friday 11am to 1pm Wednesday, April 14, 2010
  • 3. Homework Submission Problems Disk space was full, so half the class could not submit. Make sure you delete your build directory before submitting. Assignment 2 deadline moved to tonight at 11:59pm. If it still fails, you can submit by e-mail this week. Try to finish your Homework on Monday There is no “new information” for homework in Monday’s lectures In fact, Monday is “moving on to the next thing” day Lots of “last minute” help on Monday (and now Tuesday morning) Not so Tuesday night Don’t be afraid to use e-mail to get help as well (but don’t depend on getting a response to something sent Tuesday night on Tuesday). Wednesday, April 14, 2010
  • 4. Communication E-mail Questions are best sent to cs193p@cs.stanford.edu Sending directly to instructor or TA’s risks slow response. Web Site Very Important! http://cs193p.stanford.edu All lectures, assignments, code, etc. will be there. This site will be your best friend when it comes to getting info. Wednesday, April 14, 2010
  • 5. Today’s Topics “Under the Hood” of “View-based Application” Application Lifecycle View Controller Lifecycle UINavigationController Demo Continuation Wednesday, April 14, 2010
  • 6. main() Like any C application, your app starts here Here’s the code from main.m (found in Other Sources folder in Xcode window): #import <UIKit/UIKit.h> int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } Wednesday, April 14, 2010
  • 7. main() #import <UIKit/UIKit.h> int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } UIApplicationMain() creates a UIApplication object (despite return value, it never returns). The third argument is the name of the class of your UIApplication (nil is the same as @”UIApplication”) The fourth argument is the name of the class which will be your UIApplication’s delegate (nil means “none,” but it’ going to get set via s the application’s “MainWindow.xib” file--next slide). We’ll talk about NSAutoreleasePool later (the one above does nothing). Wednesday, April 14, 2010
  • 8. UIApplication What is this “application object” you speak of? It is a shared object (singleton). There is only ever one instance of it. You can get ahold of it via ... UIApplication *app = [UIApplication sharedApplication]; Has a lot of stuff you’ll never use But here are a few of interest ... @property BOOL networkActivityIndicatorVisible; @property BOOL statusBarHidden; @property UIStatusBarStyle statusBarStyle; Other things that we’ll get into later Wednesday, April 14, 2010
  • 9. Application Lifecycle Create UIApplication object Application initializes itself MainWindow.xib is loaded (delegate is usually set) NSAutoreleasePool is created Application waits for events to occur Events are dispatched to your code When done, screen is updated (drawRect: might be called) NSAutoreleasePool is drained Application waits for events to occur again System asks application to terminate and it does Wednesday, April 14, 2010
  • 10. Autorelease Pools Pool Pool created pp en t p h a zed nib v en t ap u nc itiali ain fo re ev xit La in ad m it dle E pp L o W a H an A Wednesday, April 14, 2010
  • 11. Autorelease Pools Pool Objects autoreleased here go into pool [object autorelease]; Pool created pp en t p h a zed nib v en t ap u nc itiali ain fo re ev xit La in ad m it dle E pp L o W a H an A Wednesday, April 14, 2010
  • 12. Autorelease Pools Pool Objects autoreleased here go into pool Pool created pp en t p h a zed nib v en t ap u nc itiali ain fo re ev xit La in ad m it dle E pp L o W a H an A Wednesday, April 14, 2010
  • 13. Autorelease Pools [object release]; Pool [object release]; Objects autoreleased here go into pool [object release]; Pool released Pool created pp en t p h a zed nib v en t ap u nc itiali ain fo re ev xit La in ad m it dle E pp L o W a H an A Wednesday, April 14, 2010
  • 14. Autorelease Pools Pool Objects autoreleased here go into pool Pool released Pool created pp en t p h a zed nib v en t ap u nc itiali ain fo re ev xit La in ad m it dle E pp L o W a H an A Wednesday, April 14, 2010
  • 15. Application Lifecycle Parts of the lifecycle you are involved in: 1. MainWindow.xib - you can edit it 2. Application Delegate - you can implement it 3. Event Handling and Drawing - you can implement The rest is handled automatically for you We covered #3 on Monday. Let’s look at #1 and #2 now. Wednesday, April 14, 2010
  • 16. MainWindow.xib Automatically loaded Contains (what is usually the only) UIWindow for your app Contains the Application Delegate (this is just an NSObject with it’s class set in the Identity Inspector in IB) The delegate implements the UIApplicationDelegate protocol All the methods in this protocol are optional Xcode creates a MainWindow.xib for you Xcode creates a template Application Delegate for you It calls it <YourApplicationName>AppDelegate.[mh] Wednesday, April 14, 2010
  • 17. MainWindow.xib If you choose “View-based Application” when you create your project, Xcode will create a View Controller in MainWindow.xib It will be called <YourApplicationName>ViewController. And its “NIB Name” property will be <YourApplicationName>ViewController.xib. The AppDelegate that Xcode creates will have outlets to the window and and to the View Controller in MainWindow.xib For example, here’s the AppDelegate Xcode created for Happiness: #import <UIKit/UIKit.h> @class HappinessViewController; @interface HappinessAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; HappinessViewController *viewController; } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet HappinessViewController *viewController; @end Wednesday, April 14, 2010
  • 18. MainWindow.nib If you choose “Window-based Application” when you create your project, Xcode will only create the UIWindow (no View Controller) in MainWindow.xib We will do that today in our demo The AppDelegate will look like this (our demo app today is “Psychologist”): #import <UIKit/UIKit.h> @interface PsychologistAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; } @property (nonatomic, retain) IBOutlet UIWindow *window; @end Wednesday, April 14, 2010
  • 19. Application Delegate Application Delegate is involved in the entire lifecycle - (void)applicationDidFinishLaunching: - (void)applicationDidBecomeActive: - (BOOL)application:handleOpenURL: - (void)applicationDidReceiveMemoryWarning: - (void)applicationWillResignActive: - (void)applicationDidResignActive: - (void)application:willChangeStatusBarOrientation:duration: - (void)application:didChangeStatusBarOrientation: - (void)applicationWillTerminate: ... and more Wednesday, April 14, 2010
  • 20. Application Delegate applicationDidFinishLaunching: This is only called after MainWindow.xib is loaded. Note the property in UIViewController called view. All UIViewControllers have a view property which is their top-level view. It is either built in UIViewController’s loadView or from its .xib file. In this case, it is wired up to the top-level view in HappinessViewController.xib (not in MainWindow.xib). We simply add it as a subview of the main window below. @implementation HappinessAppDelegate @synthesize window; @synthesize viewController; - (void)applicationDidFinishLaunching:(UIApplication *)application { // Override point for customization after app launch [window addSubview:viewController.view]; [window makeKeyAndVisible]; } - (void)dealloc { [viewController release]; // this should be self.viewController = nil [window release]; // this should be self.window = nil [super dealloc]; } @end Wednesday, April 14, 2010
  • 21. Application Delegate applicationWillTerminate: There is no way to stop the termination, you just have a chance to clean up. Don’t do anything that takes very long here! If you have a lot of data to write out or something, do as you go, not here. Here’s an example which writes out NSUserDefaults. @implementation HappinessAppDelegate - (void)applicationWillTerminate:(UIApplication *)application { [[NSUserDefault standardUserDefaults] synchronize]; } @end Wednesday, April 14, 2010
  • 22. Application Delegate applicationDidReceiveMemoryWarning: Now is the time to clean up big memory hogs: Image data Large data sets Sounds or other media Anything that can be reconstructed from a permanent store like disk View Controllers also receive a version of this, and they are even more likely to be able to do something about it than the Application Delegate so many times there is no implementation here at all. Wednesday, April 14, 2010
  • 23. View Controller It’s an MVC Controller with a property pointing to its View @property (nonatomic, retain) UIView *view; Note that it retains its view, so you won’t have to. We’ve seen that property as an outlet (and ignored it) in IB a few times. It has a “lifecycle” too, which starts with creating it Its designated initializer specifies .xib file to use - (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle If nibBundle is nil, it gets it out of the Resources folder in Xcode. Usually you just call init which looks for a .xib of the same name as class. If there is no .xib, then you must subclass UIViewController and implement: - (void)loadView If you don’t use a .xib, this method MUST set the view property. Don’t specify nibName and also implement loadView, it’s one or the other (it’s undefined what it means to do both). Wednesday, April 14, 2010
  • 24. View Controller Lifecycle continued ... Once it is created, it sends viewDidLoad to itself - (void)viewDidLoad { / set up properties and such of the view here / / but don’t start loading data or other expensive operations / view.someProperty = 35; } Just before it appears on screen, it sends - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; / can be called anywhere in here / / kick off data loading now, but don’t block (use threads) / [self beginLoadingDataFromTheWeb]; / maybe set up UI to indicate data loading in progress / } Wednesday, April 14, 2010
  • 25. View Controller Lifecycle continued ... Just before it disappears from the screen - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; / can be called anywhere in here / / be nice to user in case they come back to this view / [self rememberScrollPosition]; / do other things that make sense now that we’re going away / [self saveDataToPermanentStore]; / again, be careful not to do anything time-consuming here / } Also: - (void)viewDidAppear:(BOOL)animated - (void)viewDidDisappear:(BOOL)animated Wednesday, April 14, 2010
  • 26. View Controller Lifecycle continued ... If we are low on memory - (void)viewDidUnload { self.outlet = nil; / release outlets so they can get deallocated / } By the time this is called, the view property is nil. This almost never happens (i.e. when memory is low, this is rarely called). There are bigger memory fish to fry. Wednesday, April 14, 2010
  • 27. View Controller What else can a View Controller do? It knows what container it is in Might be in a Tab Bar or a Navigation Controller or a Split View, et. al. @property (readonly) UINavigationController *navigationController; @property (readonly) UITabBarController *tabBarController; @property (readonly) UISplitViewController *splitViewController; Might be being displayed modally by another View Controller @property (readonly) UIViewController *modalViewController; Can control whether it can be rotated by the user - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) By default, returns NO. Return YES to any orientation your View is willing to support. Other methods will notify you when rotation happens, e.g. - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation) ... - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation) Wednesday, April 14, 2010
  • 28. View Controller What else can a View Controller do? Has a property which is an object which contains all sorts of info about how to display the top bar if the View Controller is in a UINavigationController @property (readonly) UINavigationItem *navigationItem; (note that it automatically creates one for you if it doesn’t exist, that’s why it is a readonly property with no setter) UINavigationItem has a lot of properties, e.g. @property NSString *title; @property UIBarButtonItem *leftBarButtonItem; @property UIBarButtonItem *rightBarButtonItem; @property UIView *titleView; / replaces title with an arbitrary view / Lots of other stuff. Check out documentation. Wednesday, April 14, 2010
  • 29. Controllers of Controllers There are a handful of special kinds of UIViewControllers in UIKit. They are UIViewControllers whose view is an arrangement of the views of other UIViewControllers UINavigationController Hierarchical flow of views UITabBarController Independently tabbable views UISplitViewController Side-by-side master->detail view Wednesday, April 14, 2010
  • 30. UINavigationController Manages a “stack” of View Controllers The view belonging to the View Controller on the top of the stack is displayed What controls are in the top and bottom bar of the UINavigationController is also controlled by the View Controller on top of the stack When a selection of some sort is made in the top View Controller’s view, a new View Controller can be pushed onto the stack and become the new top There is always a “back” button in the upper left corner of the view for popping off the stack (i.e. going back) Wednesday, April 14, 2010
  • 31. UINavigationController’s Parts • view of the UIViewController which is currently on the top of the stack Wednesday, April 14, 2010
  • 32. UINavigationController’s Parts • view of the UIViewController which is currently on the top of the stack • title (an NSString property on UIViewController) of the one on top of the stack Wednesday, April 14, 2010
  • 33. UINavigationController’s Parts • view of the UIViewController which is currently on the top of the stack • title (an NSString property on UIViewController) of the one on top of the stack • title of the UIViewController which is next down on the stack Wednesday, April 14, 2010
  • 34. UINavigationController’s Parts • view of the UIViewController which is currently on the top of the stack • title (an NSString property on UIViewController) of the one on top of the stack • title of the UIViewController which is next down on the stack • toolbarItems (an NSArray of UIBarButtonItems) of the UIViewController which is on top of the stack Wednesday, April 14, 2010
  • 35. UINavigationController Designated initializer is init But there is a convenience initializer to start stack off - initWithRootViewController:(UIViewController *)vc Pushing UIViewControllers onto the stack - (void)pushViewController:(UIViewController *)vc animated:(BOOL)animated UIViewControllers know which UINavigationController they are in (if any), so it’s easy to push the next one on the stack from the one that is currently on the stack - (void)someAction:(UIButton *)sender { UIViewController *vcToPush = ...; [self.navigationController pushViewController:vcToPush animated:YES]; } By the way, animated is YES always except very first push Wednesday, April 14, 2010
  • 36. UINavigationController Notice that the space available for your view is smaller inside a UINavigationController (because of the bars on top and bottom) So make sure you have your autosizing set up properly in Interface Builder There are also methods in UIView to set autosizing Wednesday, April 14, 2010
  • 37. UINavigationController How you pass data between views on the stack is important Don’t use global variables Your Application Delegate is a global variable! So how to do it? Set up the data in a UIViewController before pushing it. Imagine you have an action method in the top VC on the stack (visible). - (void)someAction:(UIButton *)sender { MoreDetailViewController *vcToPush = [self getVCToPush]; vcToPush.someProperty = ...; vcToPush.otherProperty = ...; [self.navigationController pushViewController:vcToPush animated:YES]; } VCs on the stack should not have pointers to the VC that pushed them on. Wednesday, April 14, 2010
  • 38. UINavigationController If you absolutely need data from the VC that pushed you onto the stack, use a protocol to get it and have that pushing VC set itself as your delegate Wednesday, April 14, 2010
  • 39. Demo We’ll take a look at HappinessAppDelegate and MainWindow.nib Create a new project not using “View-based App.” We’ll reuse HappinessViewController and FaceView by dragging them into our new project Next we’ll create a new UIViewController which will push a HappinessViewController Finally, we’ll create a UINavigationController and call addSubview: with its view on our main window Wednesday, April 14, 2010
  • 40. Homework Creating a new project that is not “View-based” You’ll have to implement your own applicationDidFinishLaunching: Importing (reusing) code from another project You’ll reuse your CalculatorBrain and your CalculatorViewController Creating a custom view with its own drawRect: Creating a UIViewController Creating a UINavigationController Pushing a UIViewController in the context of a UINavigationController Wednesday, April 14, 2010