https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/AboutViewControllers/AboutViewControllers.html#//apple_ref/doc/uid/TP40007457-CH112-SW10
https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html#//apple_ref/doc/uid/TP40007457-CH111-SW1
1, navigation controller
2, tab bar controller
3, split view controller In portrait mode, only the detail view is displayed. The list view is made available using a popover. However, when displayed in landscape mode, the split view controller displays the contents of both children side by side.4, page view controller
For a view controller’s contents to be visible to the user, it must be associated with a window. There are many ways you can do this in your app:
Make the view controller a window’s root view controller.
Make the view controller a child of a container.
Show the view controller in a popover control.
Present it from another view controller.
Most of the time, you present view controllers to gather information from the user or capture the user’s attention for some specific purpose. Once that purpose is completed, the presenting view controller dismisses the presented view controller and returns to the standard app interface. When presenting a view controller, one view controller determines how much of the screen is used to present the view controller. The portion of the screen is called the presentation context By default, the presentation context is defined to cover the window.
The ability to present view controllers is a tool that you have at your disposal for interrupting the current workflow and displaying a new set of views. Most commonly, an app presents a view controller as a temporary interruption to obtain important information from the user.
You can remove all objects in the chain by dismissing the first presented view controller. Dismissing a view controller dismisses not only that view controller but also any view controllers it presented.
Presentation Styles for Modal Views
For iPad apps, you can present content using several different styles. In iPhone apps, presented views always cover the visible portion of the window, but when running on an iPad, view controllers use the value in their modalPresentationStyle
property to determine their appearance when presented. Different options for this property allow you to present the view controller so that it fills all or only part of the screen.
Figure 10-4 shows the core presentation styles that are available. (The UIModalPresentationCurrentContext
style lets a view controller adopt the presentation style of its parent.) In each presentation style, the dimmed areas show the underlying content but do not allow taps in that content. Therefore, unlike a popover, your presented views must still have controls that allow the user to dismiss the view.
Figure 10-4 iPad presentation styles
For guidance on when to use the different presentation styles, see Modal View in iOS Human Interface Guidelines.
Presenting a View Controller and Choosing a Transition Style
When a view controller is presented using a storyboard segue, it is automatically instantiated and presented. The presenting view controller can configure the destination view controller before it is presented. For more information, see Configuring the Destination Controller When a Segue is Triggered.
If you need to present a view controller programmatically, you must do the following:
Create the view controller you want to present.
Set the
modalTransitionStyle
property of the view controller to the desired value.Assign a delegate object to the view controller. Typically, the delegate is the presenting view controller. The delegate is used by the presented view controllers to notify the presenting view controller when it is ready to be dismissed. It may also communicate other information back to the delegate.
Call the
presentViewController:animated:completion:
method of the current view controller, passing in the view controller you want to present.
The presentViewController:animated:completion:
method presents the view for the specified view controller object and configures the presenting-presented relationships between the new view controller and the current view controller. Unless you are restoring your app to some previous state, you usually want to animate the appearance of the new view controller. The transition style you should use depends on how you plan to use the presented view controller. Table 10-1 lists the transition styles you can assign to the modalTransitionStyle
property of the presented view controller and describes how you might use each one.
Transition style |
Usage |
---|---|
Use this style when you want to interrupt the current workflow to gather information from the user. You can also use it to present content that the user might or might not modify. For this style of transition, content view controllers should provide buttons to dismiss the view controller explicitly. Typically, these are a Done button and an optional Cancel button. If you do not explicitly set a transition style, this style is used by default. |
|
Use this style to change the work mode of your app temporarily. The most common usage for this style is to display settings that might change frequently, such as in the Stocks and Weather apps. These settings can be meant for the entire app or they can be specific to the current screen. For this style of transition, you usually provide some sort of button to return the user to the normal running mode of your app. |
|
Use this style to present an alternate interface when the device changes orientations. In such a case, your app is responsible for presenting and dismissing the alternate interface in response to orientation change notifications. Media-based apps can also use this style to fade in screens displaying media content. For an example of how to implement an alternate interface in response to device orientation changes, see Creating an Alternate Landscape Interface. |
Listing 10-1 shows how to present a view controller programmatically. When the user adds a new recipe, the app prompts the user for basic information about the recipe by presenting a navigation controller. A navigation controller was chosen so that there would be a standard place to put a Cancel and Done button. Using a navigation controller also makes it easier to expand the new recipe interface in the future. All you would have to do is push new view controllers on the navigation stack.
Listing 10-1 Presenting a view controller programmatically
- (void)add:(id)sender {
// Create the root view controller for the navigation controller
// The new view controller configures a Cancel and Done button for the
// navigation bar.
RecipeAddViewController *addController = [[RecipeAddViewController alloc] init]; // Configure the RecipeAddViewController. In this case, it reports any
// changes to a custom delegate object.
addController.delegate = self; // Create the navigation controller and present it.
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:addController];
[self presentViewController:navigationController animated:YES completion: nil];
}
When the user taps either the Done or the Cancel button from the new recipe entry interface, the app dismisses the view controller and returns the user to the main view. See Dismissing a Presented View Controller.
- initWithRootViewController:
Initializes and returns a newly created navigation controller.
Declaration
Swift
init(rootViewController
rootViewController
: UIViewController)
Objective-C
- (instancetype)initWithRootViewController:(UIViewController *)
rootViewController
Parameters
|
The view controller that resides at the bottom of the navigation stack. This object cannot be an instance of the |
Return Value
The initialized navigation controller object or nil
if there was a problem initializing the object.
Discussion
This is a convenience method for initializing the receiver and pushing
a root view controller onto the navigation stack. Every navigation
stack must have at least one view controller to act as the root.
(navigation在被显示的时候, 其 navigation stack 不允许为空,因此在navigation 被prensted的时候,必须向navigation stack里添加一个root view controller,即navigatorController的第一个view controller。这里的root view controller指的是stack里的,而不是说这个root view controller是navigator的root view controller)
Import Statement
import UIKit
Availability
Available in iOS 2.0 and later.