iOS Programming UISplitViewController
iOS Programming UISplitViewController
The iPad, on the other hand, has plenty of screen space to present both views using a built-in class called UISplitViewController.
iPad 有足够的屏幕空间来展现两个view用built-in 类称为UISplitViewController。
UISplitViewController is an iPad-only class that presents two view controllers in a master-detail relationship.
UISplitViewController 是iPad-only类,展现两个view controller 在master-detail 关系中。
The master view controller occupies a small strip on the lefthand side of the screen, and the detail view controller occupies the rest of the screen.
master view controller 占据了一个小的屏幕在左侧,detail view controller 占据了剩余的屏幕。
You will also make Nerdfeed a universal application and have it continue to use a UINavigationController when run on the iPhone.
1. Splitting Up Nerdfeed
Creating a UISplitViewController is simple since you have already learned about navigation controllers and tab bar controllers.
When you initialize a split view controller, you pass it an array of view controllers just like with a tab bar controller.
当你initialize 一个split view controller ,你就给他传递了一列 view controllers 就像一个tab bar controller.
In application:didFinishLaunchingWithOptions:, check whether the device is an iPad before instantiating a UISplitViewController. The UISplitViewController class does not exist on the iPhone, and trying to create an instance of UISplitViewController will cause an exception to be thrown.
在application:didFinishLaunchingWithOptions:(NSDictionary*)launchOptions中检查设备是否是iPad应用在实例化UISplitViewController之前。
// Check to make sure we are running on the iPad
if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) {
// webViewController must be in navigation controller; you will see why
later
UINavigationController *detailNav =
[[UINavigationController alloc] initWithRootViewController:wvc];
UISplitViewController *svc = [[UISplitViewController alloc] init];
// Set the delegate of the split view controller to the detail VC
// You will need this later - ignore the warning for now
svc.delegate = wvc;
svc.viewControllers = @[masterNav, detailNav];
// Set the root view controller of the window to the split view controller
self.window.rootViewController = svc; }
else {
// On non-iPad devices, just use the navigation controller
self.window.rootViewController = masterNav;
}
A split view controller must have both the master and the detail view controller when it is created.
一个split view controller 一定即要有master 和detail view controller 当创建的时候。
This is how a UISplitViewController works: in landscape mode, there master view controller is shown in a small strip on the left hand side of the screen and the detail view controller takes over the rest of the screen.
UISplitViewController在landscape 模式,master view controller 在左侧的一个小的地方展现,detail view controller 占据了屏幕的其他地方。
To address this problem, when a row is tapped, you need to check whether the BNRCoursesViewController is a member of a split view controller and, if it is, take a different action.
为了定位这个问题,当一行被选中后,你需要检查BNRCoursesViewController是否是split view controller 的一员,如果是,就要采取不同的动作。
You can send the message splitViewController to any UIViewController, and if that view controller is part of a split view controller it will return a pointer to the split view controller
你可以向splitViewController 发送消息给任何UIViewController ,如果view controller 是split view controller 的一部分,它将返回一个指针指向split view controller .
Otherwise, it returns nil.
否则就会返回nil。
View controllers are smart: a view controller will return this pointer if it is a member of the split view controller's array or if it belongs to another controller that is a member of a split view controller's array (as is the case with both BNRCoursesViewController and
BNRWebViewController).
View controllers 很聪明:view controller 将返回这个指针,如果他是split view controller 的一员或它属于另外一个controller ,它是split view controller 的成员。
In BNRCoursesViewController.m, locate the method tableView:didSelectRowAtIndexPath:. At the top of this method, check for a split view controller before pushing the BNRWebViewController onto the navigation stack.
在这个方法的开始,在把BNRWebViewController推到navigation stack 之前,先检查一下split view controller .
if (!self.splitViewController) {
[self.navigationController pushViewController:self.webViewController
animated:YES];
}
Now, if the BNRCoursesViewController is not in a split view controller, you assume the device is not an iPad and BNRCoursesViewController pushes the BNRWebViewController onto the navigation controller's stack.
If BNRCoursesViewController is in a split view controller, then it is left to the UISplitViewController to place the BNRWebViewController on the screen.
2 Displaying the Master View Controller in Portrait Mode
在portrait mode 下显示master view controller
UISplitViewController lets you do just that by supplying its delegate with a UIBarButtonItem.
UISplitViewController 让你做这些通过提供它的delegate用UIBarButtonItem。
Tapping this button shows the master view controller in a specialized UIPopoverController
点击这个button 将会在specialized UIPopoverController 中展现master view controller .
In your code, whenever a detail view controller was given to the split view controller, that detail
view controller was set as the split view controller's delegate.
在你的代码中,当一个detail
view controller 被给定了split view controller ,detail view controller 被设置为split view controller 的delegate.
As the delegate, the detail view controller will get a pointer to the UIBarButtonItem when rotating to portrait mode.
作为一个delegate,detail view controller 将会有一个指向UIBarButtonItem的指针当在portrait mode .
In BNRWebViewController.h, add this declaration:
@interface BNRWebViewController : UIViewController
<UISplitViewControllerDelegate>
In BNRWebViewController.m, implement the following delegate method to place the bar button item in the BNRWebViewController's navigation item.
BNRWebViewController.m方法中,实现下面的委托方法来放置bar button item 到BNRWebViewController的navigation item中。
- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController
withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc
{
// If this bar button item does not have a title, it will not appear at all
barButtonItem.title = @"Courses";
// Take this bar button item and put it on the left side of the nav item
self.navigationItem.leftBarButtonItem = barButtonItem;
}
Notice that you explicitly set the title of the button. If the button does not have a title, it will not appear at all.
注意到你明确的设置了button的标题。如果button 没有title,你将完全不会显示。
If the master view controller's navigationItem has a title, then the button will be automatically set to that title.
如果master view controller 的navigationItem 有一个title ,那么button 将会自动设为那个title。
Rotate to portrait mode, and you will see the bar button item appear on the left of the navigation bar. Tap that button, and the master view controller's view will appear in a UIPopoverController.
在navigation bar 的左侧,你就会看到bar button item.点击这个button,master view controller 的view就会显示在UIPopoverController中。
This bar button item is why we always had you put the detail view controller inside a navigation controller.
这个bar button item 是为什么我们总是把detail view controller 放在一个navigation controller 里面的原因。
You do not have to use a navigation controller to put a view controller in a split view controller, but it makes using the bar button item much easier.
你不需要必须使用navigation controller 来放置在split view controller中的一个view controller ,但是那样会使用bar button item 更容易。
There are two small issues left to address with your Courses button. First, when the device is rotated back to landscape mode, the button is still there.
现在有两个小问题,首先,当你的设备旋转到landscape mode ,button仍然在哪儿。
To remove it, the delegate needs to respond to another message from the UISplitViewController.
为了移除这些,delegate 需要响应另一个消息从UISplitViewController .
Implement this delegate method in BNRWebViewController.m.
- (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController
invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
// Remove the bar button item from the navigation item
// Double check that it is the correct button, even though we know it is if (barButtonItem == self.navigationItem.leftBarButtonItem) {
self.navigationItem.leftBarButtonItem = nil; }
}
The Courses button will now appear and disappear as you rotate between portrait and landscape modes.
3 Universalizing Nerdfeed 通用的Nerdfeed
(1)As you built Nerdfeed, you were careful about the device differences in the classes used.
(2)Nerdfeed is still a relatively simple application. It is always easier to universalize an application early in development. As an application grows, its details get buried in the massive pile of code. Finding and fixing issues as you are writing code is much easier than coming back later. Details are harder to find, and there is the risk of breaking what already works.
iOS Programming UISplitViewController的更多相关文章
- Head First iOS Programming
内部分享: Head First iOS Programming http://www.slideshare.net/tedzhaoxa/head-first-ios-programming-4606 ...
- iOS Programming Recipe 6: Creating a custom UIView using a Nib
iOS Programming Recipe 6: Creating a custom UIView using a Nib JANUARY 7, 2013 BY MIKETT 12 COMMENTS ...
- iOS Programming Autorotation, Popover Controllers, and Modal View Controllers
iOS Programming Autorotation, Popover Controllers, and Modal View Controllers 自动旋转,Popover 控制器,Moda ...
- iOS Programming Controlling Animations 动画
iOS Programming Controlling Animations 动画 The word "animation" is derived from a Latin wor ...
- iOS Programming UIStoryboard 故事板
iOS Programming UIStoryboard In this chapter, you will use a storyboard instead. Storyboards are a f ...
- iOS Programming NSUserDefaults
iOS Programming NSUserDefaults When you start an app for the first time, it uses its factory settin ...
- iOS Programming Localization 本地化
iOS Programming Localization 本地化 Internationalization is making sure your native cultural informatio ...
- iOS Programming State Restoration 状态存储
iOS Programming State Restoration 状态存储 If iOS ever needs more memory and your application is in the ...
- iOS Programming UIWebView 2
iOS Programming UIWebView 1 Instances of UIWebView render web content. UIWebView可以显示web content. In ...
随机推荐
- [IT学习]华为全连接大会2017
1.5分钟.3分钟.1分钟倒计时. 2.20万盏纽约街头的油灯接入电网,类比未来的公司IT系统会接入云? 3.1943年,全球只要5台计算机.不会的,但是会有5多云? 4.与航空业的联盟类比,云计算的 ...
- ie6不支持png图片的解决办法
在head里引入png.js文件 <!--[if lte IE 6]> <script type="text/javascript" src="js/P ...
- egrep grep -E
egrep执行效果与"grep-E" Linux egrep命令用于在文件内查找指定的字符串. egrep执行效果与"grep-E"相似,使用的语法及参数可参照 ...
- Strus2中关于ValueStack详解
什么是ValueStack 它是一个接口com.opensymphony.xwork2.util.ValueStack.我们使用它是将其做为一个容器,用于携带action数据到页面.在页面上通过ogn ...
- 深入理解Java执行时数据区
前情回想 在本专栏的前12篇博客中. 我们主要大致介绍了什么是JVM, 而且具体介绍了class文件的格式. 对于深入理解Java, 或者深入理解运行于JVM上的其它语言, 深入理解class文件格式 ...
- js闭包的本质
js之所以会有闭包,是因为js不同于其他规范的语言,js允许一个函数中再嵌套子函数,正是因为这种允许函数嵌套,导致js出现了所谓闭包. function a(){ function b(){ }; b ...
- 并不对劲的bzoj1500: [NOI2005]维修数列
传送门-> 这题没什么好说的……小清新数据结构题……并不对劲的人太菜了,之前照着标程逐行比对才过了这道题,前几天刚刚把这题一遍写对…… 其实这题应该口胡很容易.操作1,2,3,4,5就是普通的s ...
- Linux中的工作队列
工作队列(work queue)是Linux kernel中将工作推后执行的一种机制.这种机制和BH或Tasklets不同之处在于工作队列是把推后的工作交由一个内核线程去执行,因此工作队列的优势就在于 ...
- codeforces round 417 div2 补题 CF 812 A-E
A Sagheer and Crossroads 水题略过(然而被Hack了 以后要更加谨慎) #include<bits/stdc++.h> using namespace std; i ...
- CF 809 D Hitchhiking in the Baltic States —— 思路+DP(LIS)+splay优化
题目:http://codeforces.com/contest/809/problem/D 看题解,抄标程...发现自己连 splay 都快不会写了... 首先,题目就是要得到一个 LIS: 但与一 ...