【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{
    [email protected]"班级";
    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中获取。

时间: 2024-08-28 19:35:17

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

IOS开发——UI进阶篇(十七)CALayer,核心动画基本使用

一.CALayer简介 1.CALayer在iOS中,文本输入框.一个图标等等,这些都是UIView你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层 @property(nonatomic,readonly,retain) CALayer *layer; 当UIView需

IOS开发——UI进阶篇(十)导航控制器、plist存储、微博详情页

一.导航控制器出栈 1.initWithRootViewController本质 UIViewController *vc = [[OneViewController alloc] init]; // 创建导航控制器 // 导航控制器必须要有一个根控制器 UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc]; // 会调用push方法 // initWithRoot

IOS开发-UI学习-UINavigationController(导航控制器)的使用

UINavigationController是IOS 中常用的功能,基本用法如下: 1.在AppDelegate.m中添加如下代码: 1 #import "AppDelegate.h" 2 #import "MainViewController.h" 3 4 @interface AppDelegate () 5 6 @end 7 8 @implementation AppDelegate 9 10 11 - (BOOL)application:(UIApplica

【iOS开发-54】案例学习:通过UIScrollView的缩放图片功能练习代理模式的详细实现

案例:(在模拟器中按住option键,点击鼠标就会出现缩放的手势) (1)在ViewController.m中: --缩放东西是UIScrollView除了滚动之外的还有一个功能,所以须要缩放的东西应该先放在UIScrollView里.比方此处的imageView: --而我们在缩放时候,scrollView自己是不知道我们要缩放哪个控件的,所以scrollView须要一个代理来告诉它.这个代理一般就是我们的控制器: --而控制器要成为它的代理就必须遵守它的协议. --控制器在接受协议后,就能够

IOS开发-UI学习-UIPageControl(页码控制器)的使用

UIPageControl即页码控制器,是在翻动图片阅览时下面显示的几个小点,属性设置如下: 1 UIPageControl *pagecontrol = [[UIPageControl alloc]initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, 50)]; 2 // 设置背景色 3 pagecontrol.backgroundColor = [UIColor grayColor]; 4 // 设置当前页 5 pageco

【iOS开发-76】Private Contacts案例:导航控制器使用、数据传递、第三方类库使用、tableViewCell的添加删除、数据存储等

(1)效果 (2)源代码与第三方类库下载 http://download.csdn.net/detail/wsb200514/8155979 (3)总结 --导航控制器,可以直接用代码的push和pop来控制控制器之间的跳转.也可以使用storyboard的segue来:这里又涉及2种,一种是直接用按钮拖拽到另一个控制器形成segue,这种segue不可拦截,如果点击直接跳转.另一种是从一个控制器拖拽到另一个控制器形成的segue,这种segue没有明确的点击谁来跳转,所以有一个performS

iOS开发UINavigation系列一——导航栏UINavigtionBar

iOS开发UINavigation系列一--导航栏UINavigtionBar 一.导航栏的使用 在iOS开发中,我们通常会使用导航控制器,导航控制器中封装了一个UINavigationBar,实际上,我们也可以在不使用导航控制器的前提下,单独使用导航栏,在UINavigationBar中,也有许多我们可以定制的属性,用起来十分方便. 二.UINavigationBar的创建和风格类型 导航栏继承于UIView,所以我们可以像创建普通视图那样创建导航栏,比如我们创建一个高度为80的导航栏,将其放

IOS开发防止图片渲染的方法

IOS开发中,很多时候我们在给导航控制器或者其它的控制器中的部件添加图片的时候,图片会被渲染,下面就是处理图片渲染的方法. UIImage *image = [UIImage imageNamed:@"a.jpg"]; image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

IOS开发UI基础UITextFidle相关属性

UITextFidle相关属性 •    enablesReturnKeyAutomatically默认为No,如果设置为Yes,文本框中没有输入任何字符的话,右下角的返回按钮是disabled的. 1.borderStyle 设置边框样式,只有设置了才会显示边框样式   text.borderStyle = UITextBorderStyleRoundedRect; typedef enum {    UITextBorderStyleNone,     UITextBorderStyleLi