iPad 应用中,UISplitVIEwController是最具特色的视图控制器,用于显示一个从左右分隔的分栏视图。
新建VIEw–based Appliation项目:SplitVCDemo。用IB打开SplitVCDemoVIEwController.xib,点击file->CreateiPad Version Using…,save as,文件名仍保持“SplitVCDemoVIEwController.xib”不变,覆盖:replace。
从library窗口拖一个SplitVIEw Controller到document窗口。
可以看到,Split VIEw Controller已有一个Navigation Controller和一个VIEw Controller对象了。在NavitationController下边还有一个table VIEw Controller对象,这是用于显示Split VIEw Controller左边的列表的控制器,是整个SplitVIEw Controller 中最核心的部分,我们接下来要实现它。
现在,新建一个table VIEw Controller 子类RootVC,不要选择With Xib for user interface,RootVC是用来导航VIEwController的,它不需要一个.xib文件。
我们先打开RootVC.h文件,声明几个变量:
UISplitVIEwController *splitVIEwController;
UIPopoverController *popoverController;
UIbarbuttonItem *rootPopoverbuttonItem;
同时属性声明:
@property (nonatomic,assign) IBOutlet UISplitVIEwController*splitVIEwController;
@property (nonatomic,retain) UIPopoverController*popoverController;
@property (nonatomic,retain) UIbarbuttonItem *rootPopoverbuttonItem;
回到SplitVCDemoVIEwController.xib中,把tableVIEw Controller对象的类别IDentity修改为RootVC。
建立连接,将RootVC中的splitVIEwController和IB对象SplitVIEw Controller连接起来:
同时,将 Split VIEw Controller 的delegate属性和RootVC连接起来:
这样就把 Split VIEw Controller 的一些事件委托给RootVC来实现,这需要RootVC实现协议UISplitVIEwControllerDelegate。在RootVC.h中声明协议实现,然后在RootVC.m中进行实现:
#pragma mark -
#pragma mark 旋屏支持及UISplitVIEwControllerDelegate协议实现
// 支持旋屏
- (BOol)shouldautorotatetoInterfaceOrIEntation:(UIInterfaceOrIEntation)interfaceOrIEntation {
return YES;
}
// 当splitVIEwController旋转为竖屏时,左边栏隐藏,同时显示一个工具栏按钮,用于一个PopOver Controllerd出左边栏
- (voID)splitVIEwController:(UISplitVIEwController*)svc willHIDeVIEwController:(UIVIEwController *)aVIEwController withbarbuttonItem:(UIbarbuttonItem*)barbuttonItemforPopoverController:(UIPopoverController*)pc {
// 从参数获得按钮和popover controller的引用.
barbuttonItem.Title = @"Root VIEw Controller";
self.popoverController =pc;
self.rootPopoverbuttonItem =barbuttonItem;
// 获取右边栏,在右边栏中显示按钮
UIVIEwController<SubstitutableDetailVIEwController> *detailVIEwController = [splitVIEwController.vIEwControllers objectAtIndex:1];
[detailVIEwController showRootPopoverbuttonItem:rootPopoverbuttonItem];
}
// 当split VIEw controller旋转为横屏,左边栏显示,同时消除popover按钮
- (voID)splitVIEwController:(UISplitVIEwController*)svc willShowVIEwController:(UIVIEwController *)aVIEwController invalIDatingbarbuttonItem:(UIbarbuttonItem*)barbuttonItem {
UIVIEwController<SubstitutableDetailVIEwController> *detailVIEwController = [splitVIEwController.vIEwControllers objectAtIndex:1];
// SubstituableDetailVIEwController协议规定了两个方法,分别用于显示/清除popover按钮
[detailVIEwControllerinvalIDateRootPopoverbuttonItem:rootPopoverbuttonItem];
// 释放
self.popoverController =nil;
self.rootPopoverbuttonItem =nil;
}
当屏幕竖屏显示时,Split VIEw Controller会隐藏左边栏而只显示右边栏,为了让用户能看到左边栏,我们需要在右边栏的工具条上显示一个popover按钮。这样,在左边栏不显示的情况下,用户可以通过点击这个popover按钮来d出显示左边栏的内容。为此,我们在RootVC.h中定义了一个协议SubstitutableDetailVIEwController,要求在必要的时候右边栏能实现popover按钮的显示方法和消除方法:
@protocolSubstitutableDetailVIEwController
- (voID)showRootPopoverbuttonItem:(UIbarbuttonItem *)barbuttonItem;
- (voID)invalIDateRootPopoverbuttonItem:(UIbarbuttonItem *)barbuttonItem;
@end
接下来就是实现UItableVIEw的UItableVIEwDataSource协议和UItableVIEwDelegate协议。这都是大家都熟悉的内容了:
#pragma mark -
#pragma mark tablevIEw data source method
- (NSInteger)tableVIEw:(UItableVIEw *)atableVIEwnumberOfRowsInSection:(NSInteger)section {
return 2;
}
- (UItableVIEwCell *)tableVIEw:(UItableVIEw *)atableVIEwcellForRowAtIndexPath:(NSIndexPath *)indexPath {
static Nsstring *CellIDentifIEr = @"RootVIEwControllerCellIDentifIEr";
UItableVIEwCell *cell = [self.tableVIEw dequeueReusableCellWithIDentifIEr:CellIDentifIEr];
if (cell == nil) {
cell = [[[UItableVIEwCell alloc] initWithStyle:UItableVIEwCellStyleDefault reuseIDentifIEr:CellIDentifIEr] autorelease];
}
if (indexPath.row == 0) {
cell.textLabel.text = @"First DetailVIEw Controller";
}
else {
cell.textLabel.text = @"Second DetailVIEw Controller";
}
return cell;
}
#pragma mark -
#pragma mark tablevIEw delegate method
- (voID)tableVIEw:(UItableVIEw *)tableVIEwdIDSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSUInteger row = indexPath.row;
UIVIEwController <SubstitutableDetailVIEwController>*detailVIEwController = nil;
if (row == 0) {
detailVIEwController= [[DetailVC alloc] initWithNibname:@"DetailVC" bundle:nil];
[detailVIEwController.vIEw setBackgroundcolor:[UIcolor redcolor]];
}
if (row == 1) {
detailVIEwController = [[DetailVC alloc] initWithNibname:@"DetailVC" bundle:nil];
[detailVIEwController.vIEw setBackgroundcolor:[UIcolor bluecolor]];
}
// 修改 split vIEw controller的vIEwControllers属性.
NSArray *vIEwControllers = [[NSArray alloc] initWithObjects:self.navigationController,detailVIEwController,nil];
splitVIEwController.vIEwControllers =vIEwControllers;
[vIEwControllers release];
// 如果popover窗口在d出中,解散
if (popoverController!= nil) {
[popoverController dismisspopoverAnimated:YES];
}
// 重新设置右边栏的popover按钮
if (rootPopoverbuttonItem!= nil) {
[detailVIEwController showRootPopoverbuttonItem:self.rootPopoverbuttonItem];
}
[detailVIEwControllerrelease];
}
接下来我们实现右边栏的视图控制器。你可以实现多个VIEw Controller,但为求简便。我们只实现一个。在 tableVIEwv:dIDSelectRowAtIndexPath:代码中,你可以看到针对每一行的点击,我们都new了一个DetailVC对象作为右边栏的VIEw Controller。如果你愿意,你也可以针对每一行的点击new不同VIEwController类作为右边栏。这样,自然就能通过左边的列表导航到多个Detail VIEw Controller了。
新建VIEw Controller类DetailVC,这次需要一个.xib文件。 打开DetailVC.h,增加变量声明:
UIToolbar *toolbar;
将变量声明为出口:
@property (nonatomic,retain) IBOutlet UIToolbar *toolbar;
然后,在DetailVC.m中实现以下方法:
#pragma mark SubstitutableDetailVIEwController协议实现
- (voID)showRootPopoverbuttonItem:(UIbarbuttonItem *)barbuttonItem {
// Add the popover button to the toolbar.
NSMutableArray*itemsArray = [toolbar.items mutablecopy];
[itemsArray insertObject:barbuttonItem atIndex:0];
[toolbar setItems:itemsArray animated:NO];
[itemsArray release];
}
- (voID)invalIDateRootPopoverbuttonItem:(UIbarbuttonItem*)barbuttonItem {
// Remove the popover button from the toolbar.
NSMutableArray *itemsArray= [toolbar.items mutablecopy];
[itemsArray removeObject:barbuttonItem];
[toolbar setItems:itemsArray animated:NO];
[itemsArray release];
}
#pragma mark 旋屏支持
- (BOol)shouldautorotatetoInterfaceOrIEntation:(UIInterfaceOrIEntation)interfaceOrIEntation {
return YES;
}
打开DetailVC.xib文件,将其转换为iPad版本。然后拖一个Tool bar在视图中,并把Tool bar连接到出口IBOutlettoolbar。
回到SplitVCDemoVIEwController.xib,把VIEw Controller对象的类别IDentity修改为DetailVC:
这样并不能就显示出Split VIEw Controller来,因为Split VIEw Controller还没有把视图addSubvIEw到视图控制器的vIEw中。
首先我们要在SplitVCDemoVIEwController.h中声明一个出口用于连接Split VIEw Controller对象:
SplitVCDemoVIEwController *vIEwController;
⋯⋯
@property (nonatomic,retain) IBOutletSplitVCDemoVIEwController *vIEwController;
然后,回到SplitVCDemoVIEwController.xib,把IB对象Split VIEw Controller连接到出口vIEwController。
然后在SplitVCDemoVIEwController.m的vIEwDIDLoad方法中,我们可以加载Split VIEwController了:
- (voID)vIEwDIDLoad {
// [self.vIEw addSubvIEw:splitVC.vIEw];
//Split VIEw Controller 只能作为window的根视图控制器
UIWindow* window=[(SplitVCDemoAppDelegate*)[[UIApplication sharedApplication]delegate]window];
window.rootVIEwController=splitVC;
}
这里需要说明一点,要把Split VIEw Controller添加到视图中,你不能使用UIVIEw或者UIWindow的addSubvIEw方法。这个问题说起来很简单,但网络上并没有正确的答案,许多解决思路都没有说在点子上。
苹果文档中说明,Split VIEw Controller只能作为应用程序Window的根视图控制器使用, 很多程序员都在为Split VIEwController只能作为根视图控制器的问题而烦扰,实际上解决的办法是如此简单:
我们直接获取到应用程序委托的window对象,把它的rootVIEwController属性设置为Split VIEw Controller实例就可以了(原来是这个属性被设置为SplitVCDemoVIEwController实例对象)。
现在,我们可以运行程序了。模拟器开始总是竖屏启动的,这时没有左边的列表栏。但工具栏上有一个popover按钮,点击它列表栏以d出方式显示:
总结以上是内存溢出为你收集整理的iPad开发:UISplitViewController应用全部内容,希望文章能够帮你解决iPad开发:UISplitViewController应用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)