IPad的屏幕比较大,应该有更好的利用方式,能不能同时放两个Viewcontroller的View呢?可以的,用UISplitViewController。iPad上的设置不就是分成左右两个么。
UISplitViewController只能在iPad上使用,在其他设备上将会异常。
Xcode有提供Master-Detail Application模版,可以很方便看到UISpliViewController的使用例子。
工程中有两个非常重要的控制器
RootViewController 主视图控制器
在iPad上,主视图在左边,iPhone上它是第一个视图
DetailViewController 详细视图控制器
在iPad上,详细视图显示在右边,iPhone上它将作为新的视图显示出来
这里需要考虑的是主视图控制器与详细试图控制器的通讯问题,你可以通过app delegate 来通讯,也可以通过主视图控制器发消息给详细试图控制器,两者都可以。
此时当你运行程序切换到详细试图并旋转iPad,你会发现主视图消失了,只在详细视图上多出个导航按钮。其实这也不错了,可是我们不喜欢不是,你看设置那边,旋转过来时,主视图仍然在左边显示,它是怎么做到的呢?很简单,apple已有api可用,在详细试图控制器里面实现这个接口(ios5.0):
- (BOOL) splitViewController:(UISplitViewController *)svc
shouldHideViewController:(UIViewController *)vc
inOrientation:(UIInterfaceOrientation)orientation{
return NO;
}
模版中默认是没有实现上面的接口的,返回的值相当于return yes. 这是需要实现另外两个接口:
- (void)splitViewController:(UISplitViewController *)svc
willHideViewController:(UIViewController *)aViewController
withBarButtonItem:(UIBarButtonItem *)barButtonItem
forPopoverController: (UIPopoverController *)pc{
barButtonItem.title = @"Master";
NSMutableArray *items = [[self.toolbar items] mutableCopy];
[items insertObject:barButtonItem atIndex:0];
[self.toolbar setItems:items animated:YES];
self.popoverController = pc;
}
- (void)splitViewController:(UISplitViewController *)svc
willShowViewController:(UIViewController *)aViewController
invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem{
NSMutableArray *items = [[self.toolbar items] mutableCopy];
[items removeObjectAtIndex:0];
[self.toolbar setItems:items animated:YES];
self.popoverController = nil;
}
在我创建的模版中,代码与书上的有点不同,上面的是书上的代码。主要是提供了再主视图隐藏时,有个按钮可以把它呼出来。当然了也可以通过滑动手势把它呼出来。
再来说说主次试图控制器通讯的问题,书上说在主视图控制器可以通过app Delegate 在拿到详细试图控制器。可是在我的模版里面,主视图直接就有个访问详细试图的属性,可能是模版更新了吧。