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上的基本樣式截圖為:

<5>在故事板布局的樣式截圖為:

 

下面我們就通過純代碼的方式創建如下:

1、創建兩個控制器類,一個為主控制器類MasterViewController,一個為詳細控制器類DetailViewController

 

2、導入幾張素材圖片,用來在詳細控制器中顯示。所有的文件截圖為:

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]];
}

演示結果如下:

開始時:

點擊Master,顯示Master主控制器:

點擊單元格時,Detail詳細控制器顯示的內容:

點擊屏幕,關閉Master主控制器:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM