【iOS开发-107】UISplitViewController:如何取得master和detail控制器,核心在于如何运用代理

UISplitViewController也是iPad的特有类。用storyboard方式创建UISplitViewController暂且不谈。

(1)直接从代码创建的话,先在AppDelegate中设置window的根控制器

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    WPMainSplitViewController *splitVc=[[WPMainSplitViewController alloc]init]; 
    self.window.rootViewController=splitVc;
    [self.window makeKeyAndVisible];
    return YES;
}

然后在我们的主角WPMainSplitViewController中设置细节(继承自UISplitViewController的一个类)

- (void)viewDidLoad {
    [super viewDidLoad];
    //设置两个装有tableView的导航控制器作为左右视图
    LeftTableViewController *left=[[LeftTableViewController alloc]init];
    UINavigationController *leftNav=[[UINavigationController alloc]initWithRootViewController:left];
    RightTableViewController *right=[[RightTableViewController alloc]init];
    UINavigationController *rightNav=[[UINavigationController alloc]initWithRootViewController:right];
    self.viewControllers=[NSArray arrayWithObjects:leftNav,rightNav, nil];

其实,就可以了。


(2)常用的是代理。分隔视图控制器有自带的代理,UISplitViewControllerDelegate

比如,在上面的代码中加入:

- (void)viewDidLoad {
    [super viewDidLoad];
    ......
    self.delegate=right;
    ……
}

然后在right这个表视图控制器中就可以实现代理方法(常用的比如监听APP转向时master视图的隐藏和显示):隐藏时detail视图的左上角出现BarButtonItem用于点击出现master视图,显示时就不出现这个BarButtonItem。

//显示或者隐藏一般都是针对左边的那个菜单式的视图
-(void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem{
    //按钮点击事件官方已经封装
    self.navigationItem.leftBarButtonItem=nil;
}

-(void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc{
    barButtonItem.title=@"班级";
    self.navigationItem.leftBarButtonItem=barButtonItem;
}

(3)当然,更正常的应该是点击左边的视图中得东西,右边会出现对应的视图。这个也是用代理。不过这个时候的代理就是detail视图(右边)是master驶入(左边)的代理。

- (void)viewDidLoad {
    [super viewDidLoad];
    //当需要点击左边,右边做出响应时,可以利用代理(取出左右两边的控制器,并设置代理)
    LeftTableViewController *leftOne=[self.viewControllers firstObject];
    RightTableViewController *rightOne=[self.viewControllers lastObject];
    leftOne.delegate=rightOne;
}

注意:一般项目中不是直接在split视图控制器中写出master和detail视图控制器,所以如果要取得左右2个视图的话,需要用如上得方法获取,即用firstObject和lastObject从self.viewControllers中获取。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。