首页 » iOS编程(第4版) » iOS编程(第4版)全文在线阅读

《iOS编程(第4版)》22.2 在竖排模式下显示主视图控制器

关灯直达底部

在竖排模式下,UISplitViewController对象不会显示主视图控制器。最好能通过某种途径、不用转动设备就能显示主视图控制器,进而可以通过UITableView对象选择课程。UISplitViewController对此有内建的处理机制:应用可以通过其委托方法得到一个UIBarButtonItem对象。按下这个按钮,应用会显示一个包含相应主视图控制器的UIPopoverController对象(见图22-4)。

图22-4 UIPopoverController对象中的主视图控制器

当Nerdfeed将某个视图控制器设置为UISplitViewController的从视图控制器时,会将该视图控制器设置为UISplitViewController的委托。当设备转动至竖屏模式时,这个视图控制器会收到相应的委托消息,并得到一个指向特定UIBarButtonItem对象的指针。

在BNRWebViewController.h中,将BNRWebViewController声明为遵守UISplitViewControllerDelegate协议,代码如下:

@interface BNRWebViewController : UIViewController

<UISplitViewControllerDelegate>

构建并运行应用,Nerdfeed的运行结果应该和之前的一样,且Xcode不会再显示警告信息。

在BNRWebViewController.m中实现以下委托方法,将传入的UIBarButtonItem对象加入BNRWebViewController对象的navigationItem,代码如下:

- (void)splitViewController:(UISplitViewController *)svc

willHideViewController:(UIViewController *)aViewController

withBarButtonItem:(UIBarButtonItem *)barButtonItem

forPopoverController:(UIPopoverController *)pc

{

// 如果某个UIBarButtonItem对象没有标题,该对象就不会有任何显示

barButtonItem.title = @“Courses”;

// 将传入的UIBarButtonItem对象设置为navigationItem的左侧按钮

self.navigationItem.leftBarButtonItem = barButtonItem;

}

这段代码为UIBarButtonItem对象设置了标题。如果某个UIBarButtonItem对象没有标题,该对象就不会有任何显示(如果主视图控制器的navigationItem的title属性不是空字符串,UINavigationController对象就会自动将该字符串作为标题赋给相应的UIBarButtonItem对象)。

构建并运行应用。旋转设备至竖屏模式,Nerdfeed应该会在导航条左侧显示一个UIBarButtonItem对象。按下这个按钮,Nerdfeed应该会显示包含主视图控制器的UIPopoverController对象。

之前要求读者必须将从视图控制器放置在UINavigationController中,目的是能在导航条上显示上述UIBarButtonItem对象。虽然无须通过UINavigationController就能将某个视图控制器加入UISplitViewController对象,但是使用UINavigationController可以很方便地将UIBarButtonItem对象加入导航条。否则还需要先创建UINavigationBar或UIToolbar,加入UIBarButtonItem对象,然后将新创建的UINavigationBar或UIToolbar设置为BNRWebViewController视图的子视图。

Courses按钮还有一个问题:当用户将设备转回横屏模式时,按钮不会消失。为了解决该问题,委托对象需要实现另一个UISplitViewControllerDelegate方法。在BNRWeb- ViewController.m中实现该方法。代码如下:

- (void)splitViewController:(UISplitViewController *)svc

willShowViewController:(UIViewController *)aViewController

invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem

{

// 移除navigationItem的左侧按钮

// 确认该按钮是需要删除的那个(虽然根据现有的代码可以确定不会有错)

if (barButtonItem == self.navigationItem.leftBarButtonItem) {

self navigationItem.leftBarButtonItem = nil;

}

}

构建并运行应用。转动设备,在竖屏模式和横屏模式之间切换,Nerdfeed应该可以正确显示和隐藏Courses按钮。