iPad开发:UISplitViewController应用

iPad开发:UISplitViewController应用,第1张

概述iPad 应用中,UISplitViewController是最具特色的视图控制器,用于显示一个从左右分隔的分栏视图。 新建View–based Appliation项目:SplitVCDemo。用IB打开SplitVCDemoViewController.xib,点击File->CreateiPad Version Using…,save as,文件名仍保持“SplitVCDemoViewCon

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应用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1093277.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存