iOS:分割控制器UISplitViewcontroller

iOS:分割控制器UISplitViewcontroller

分割控制器UISplitViewController
<1>功能:它也是ipad的一个新特性,在屏幕上可以同时显示两个控制器,左边一个,右边一个;左边的为主控制器,右边的为详细控制器,主控制器可以根据需要显示或隐藏。它对于iPhone虽然可以使用,但是不具备同时显示的特点,在iPhone的样式,就是导航控制器切换的模式。
 
<2>介绍
Split View通常只是一个基本元素,它填满整个屏幕,不可能把Split View放到其他什么的内部,一般情况下是提供给整个app的。
Split View有两个ViewControllers,一个左侧一个右侧,左侧叫Master,右侧叫Detail。
SplitViewController有 一个property叫做ViewControllers,它是一个数组,这个数组有两个元素,左侧和右侧,左侧是元素0,右侧是元素1
@property (nonatomic, copy) NSArray *viewControllers;

 

 
<3>代理方法:Split View不能没有delegate,如果没有设置delegate,那么当Split View进入Portrait模式的时候左侧就会消失,你应该在角落里放一个小按钮,使用户可以点击它来让左侧出现
– 
(BOOL)splitViewController:
(UISplitViewController *)
sender

   shouldHideViewController:(UIViewController *)master inOrientation:(UIInterfaceOrientation)orientation

    {

           return YES; // always hide it

    }

– (BOOL)splitViewController:(UISplitViewController *)sender 
shouldHideViewController:(UIViewController *)master   
inOrientation:(UIInterfaceOrientation)orientation

    {

          return UIInterfaceOrientationIsPortrait(orientation); //竖屏时隐藏master

    }

-(void)splitViewController:(UISplitViewController *)sender  willHideViewController:(UIViewController *)master   withBarButtonItem:(UIBarButtonItem *)barButtonItem  forPopoverController:(UIPopoverController *)popover

   {      

       //将要隐藏master时,在detail控制器的toolbar上设置并显示一个按钮

        barButtonItem.title = @“Master”;

       [detailViewController setSplitViewBarButtonItem:barButtonItem];

   }

-(void)splitViewController:(UISplitViewController *)sender willShowViewController:(UIViewController *)master   invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem

  { 

     // removeSplitViewBarButtonItem: must remove the bar button from its toolbar   

      [detailViewController removeSplitViewBarButtonItem:nil];

   }

<4>在iPad上的基本样式截图为:

iOS:分割控制器UISplitViewcontroller

<5>在故事板布局的样式截图为:

iOS:分割控制器UISplitViewcontroller

 

下面我们就通过纯代码的方式创建如下:

1、创建两个控制器类,一个为主控制器类MasterViewController,一个为详细控制器类DetailViewController

iOS:分割控制器UISplitViewcontroller

 

iOS:分割控制器UISplitViewcontroller

2、导入几张素材图片,用来在详细控制器中显示。所有的文件截图为:

iOS:分割控制器UISplitViewcontroller

3、下面就是具体的代码创建了:

//在AppDelegate.m文件中:

导入头文件并声明必要的属性,同时实现分割控制器的协议

#import "AppDelegate.h"
#import "MasterViewController.h"
#import "DetailViewController.h"
@interface AppDelegate ()<UISplitViewControllerDelegate>
@property (strong,nonatomic)UISplitViewController *splitViewController; //声明分割控制器
@end

创建分割控制器、主控制器、详细控制器,并设置它们之间的关系,以及设置分割控制器的代理

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    //创建分割控制器
    self.splitViewController = [[UISplitViewController alloc]init];
    
    //创建MasterVC
    MasterViewController *MasterVC = [[MasterViewController alloc]init];
    
    
    //创建DetailVC
    DetailViewController *DetailVC = [[DetailViewController alloc]init];

    
    //创建左侧导航控制器
    UINavigationController *MasterNavigationController = [[UINavigationController alloc]initWithRootViewController:MasterVC];
    
    //创建右侧导航栏控制器
    UINavigationController *DetailNavigationController = [[UINavigationController alloc]initWithRootViewController:DetailVC];

    
    // 设置 UISplitViewController 所管理的左、右两个 UIViewController
    self.splitViewController.viewControllers = @[MasterNavigationController,DetailNavigationController];
    
    //设置分割控制器分割模式
    self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryHidden;
    
    //设置代理
    self.splitViewController.delegate = self;
    
    //设置window的根控制器
    self.window.rootViewController = self.splitViewController;
    
    return YES;
}

实现分割控制器协议的方法

#pragma mark -<UISplitViewController>
//主控制器将要隐藏时触发的方法
-(void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc
{
    barButtonItem.title = @"Master";
    //master将要隐藏时,给detail设置一个返回按钮
    UINavigationController *Nav = [self.splitViewController.viewControllers lastObject];
    DetailViewController *Detail = (DetailViewController *)[Nav topViewController];
    
    Detail.navigationItem.leftBarButtonItem = barButtonItem;
}

//开始时取消二级控制器,只显示详细控制器
- (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController
{
    return YES;
}


//主控制器将要显示时触发的方法
-(void)splitViewController:(UISplitViewController *)sender willShowViewController:(UIViewController *)master invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    
//master将要显示时,取消detail的返回按钮 UINavigationController
*Nav = [self.splitViewController.viewControllers lastObject]; DetailViewController *Detail = (DetailViewController *)[Nav topViewController]; Detail.navigationItem.leftBarButtonItem = nil; }

//在MasterViewcontroller.m文件中:

导入头文件并声明必要的属性,同时实现分割控制器的协议

#import "MasterViewController.h"
#import "DetailViewController.h"

@interface MasterViewController ()<UITableViewDataSource,UITableViewDelegate>
@property(strong,nonatomic)UITableView *tableView;       //表格视图
@property (strong,nonatomic)NSMutableArray *dataObjects; //文字数据
@property (strong,nonatomic)NSMutableArray *imageArrayM; //图像数据
@end

创建主控制器Master的导航栏和按钮,并设置表格视图的数据源和代理

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //创建UITableView
    self.tableView = [[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain];
    
    //创建数组
    self.dataObjects = [NSMutableArray arrayWithObjects:@"美女0",@"美女1",@"美女2",nil];
    self.imageArrayM = [NSMutableArray arrayWithObjects:[UIImage imageNamed:@"美女0.jpg"],[UIImage imageNamed:@"美女1.jpg"],[UIImage imageNamed:@"美女2.jpg"],nil];
    
    //设置数据源和代理
    self.tableView.dataSource = self;
    self.tableView.delegate = self;
    
    [self.view addSubview:self.tableView];
    
 //设置主控制器Master的导航栏和按钮
    self.navigationItem.title = @"Master";
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:nil];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:nil];
}

实现表格视图的数据源协议方法

#pragma mark -<UITableViewDataSource>
//多少行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.dataObjects.count;
}   
//设置每一个单元格的内容
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //1.根据reuseIdentifier,先到对象池中去找重用的单元格对象
    static NSString *reuseIdentifier = @"Cell";
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    //2.如果没有找到,自己创建单元格对象
    if(cell == nil)
    {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
    }
    //3.设置单元格对象的内容
    cell.textLabel.text = [self.dataObjects objectAtIndex:indexPath.row];
    return cell;
}

实现表格视图的代理协议方法

#pragma mark -<UITableViewDelegate>
//选中单元格时,设置详细控制器中的内容
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //获取详细控制器
    UINavigationController *detailNAV = [self.splitViewController.viewControllers lastObject];
    DetailViewController *detatilVC = (DetailViewController*)[detailNAV topViewController];
    
    //创建图像视图
    UIImageView *imageView = [[UIImageView alloc]initWithFrame:detatilVC.view.frame];
    [imageView setImage:[self.imageArrayM objectAtIndex:indexPath.row]];
    
    [detatilVC.view addSubview:imageView];
}

//在DEtailViewController.m文件中

设置视图背景颜色

- (void)viewDidLoad {
    [super viewDidLoad];
    //设置视图颜色为白色
    [self.view setBackgroundColor:[UIColor whiteColor]];
}

演示结果如下:

开始时:

iOS:分割控制器UISplitViewcontroller

点击Master,显示Master主控制器:

iOS:分割控制器UISplitViewcontroller

点击单元格时,Detail详细控制器显示的内容:

iOS:分割控制器UISplitViewcontroller

点击屏幕,关闭Master主控制器:

iOS:分割控制器UISplitViewcontroller

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109286.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java二维数组输入_java 二维数组的输入输出问题[通俗易懂]

    java二维数组输入_java 二维数组的输入输出问题[通俗易懂]java二维数组的输入输出问题有一个二维数组里面包含了很大的数字。我要把它通过输出流存储在.dat文件中然后在另一个程序中把这些信息读取出来,并且存储在另外一个二维数组中。请问该怎么办?这个数组如下:intmapl[][]={{0,0,0,0,148,149,149,149,149,149,149,149,149,149,178,0,0,0,0,0,…

    2022年5月8日
    122
  • Linux中top命令_linux tail命令详解

    Linux中top命令_linux tail命令详解原标题:Linux下top命令详解1、简介top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。top显示系统当前的进程和其他状况,是一个动态显示过程,可以自动或者通过用户按键来不断刷新当前状态。如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.。比较准确的说,top命令提供了实时的对系统处理器的状态监控,显示系统中CPU…

    2022年9月24日
    6
  • 艺赛旗胡立军:“机器人工厂”,让RPA风口再起

    艺赛旗胡立军:“机器人工厂”,让RPA风口再起艺赛旗胡立军:“机器人工厂”,让RPA风口再起

    2022年4月22日
    51
  • Linux终端Web浏览器w3m

    Linux终端Web浏览器w3m

    2022年3月13日
    337
  • ActiveMQ简介与安装

    1.ActiveMQ简介ActiveMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。ActiveMQ使用Apa

    2021年12月28日
    43
  • golang coredump分析「建议收藏」

    背景最近在分析golang的一个内存泄漏问题。一般来讲,使用golang自带的pprof工具就可以分析内存的使用,协程情况,是否有block等情况。但是我们项目中调用了C库,导致C库的一些东西没法通过pprof来进行监控分析。实际上通过pprof来监控程序的话,内存是稳定的,但是占用Linux的内存是一直增长的,即RES一直增长,实际上程序是有泄漏的。怀疑是使用C库导致,所以通过coredump…

    2022年4月12日
    252

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号