OC 中的 Split View函数

首页 / iOS入门教程 / OC 中的 Split View函数

Split View是iPad专用的容器,用于并排管理两个视图控制器的视图控制器。

Split View - 重要属性

  • delegate
  • viewControllers

Split View - 示例代码

步骤1 - 创建一个新项目,然后选择 Master Detail Application (而不是基于View的应用程序),然后单击"Next",输入项目名称并选择create。

步骤2 - 默认情况下,将创建一个简单的拆分视图控制器,该控件在master中具有表视图。

步骤3 - 这些文件创建的内容与基于View的应用程序略有不同。在这里,无涯教程为无涯教程创建了以下文件。

无涯教程网

  • AppDelegate.h
  • AppDelegate.m
  • DetailViewController.h
  • DetailViewController.m
  • DetailViewController.xib
  • MasterViewController.h
  • MasterViewController.m
  • MasterViewController.xib

步骤4 -  AppDelegate.h 文件如下-

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong nonatomic) UIWindow *window;

@property (strong nonatomic) UISplitViewController *splitViewController;

@end

步骤5 -  AppDelegate.m 中的 didFinishLaunchingWithOptions 方法如下-

- (BOOL)application:(UIApplication *)application 
   didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
   self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen]bounds]];
    
   //应用程序启动后自定义的覆盖点。
   MasterViewController *masterViewController = [[MasterViewController
   alloc] initWithNibName:@"MasterViewController" bundle:nil];
   UINavigationController *masterNavigationController = 
   [[UINavigationController alloc] initWithRootViewController:
   masterViewController];

   DetailViewController *detailViewController = 
   [[DetailViewController alloc] initWithNibName:@"DetailViewController" 
   bundle:nil];
   UINavigationController *detailNavigationController = 
   [[UINavigationController alloc] initWithRootViewController:
   detailViewController];

   masterViewController.detailViewController = detailViewController;

   self.splitViewController = [[UISplitViewController alloc] init];
   self.splitViewController.delegate = detailViewController;
   self.splitViewController.viewControllers =
      @[masterNavigationController detailNavigationController];
   
   self.window.rootViewController = self.splitViewController;
   [self.window makeKeyAndVisible];
   return YES;

步骤6 - MasterViewController.h如下-

#import <UIKit/UIKit.h>

@class DetailViewController;
@interface MasterViewController : UITableViewController
@property (strong nonatomic) DetailViewController *detailViewController;

@end

步骤7 - MasterViewController.m如下-

链接:https://www.learnfk.comhttps://www.learnfk.com/ios/ios-ui-elements-splitview.html

来源:LearnFk无涯教程网

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

@interface MasterViewController () {
   NSMutableArray *_objects;
}
@end

@implementation MasterViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)
   nibBundleOrNil {
   self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
   
   if (self) {
      self.title = NSLocalizedString(@"Master" @"Master");
      self.clearsSelectionOnViewWillAppear = NO;
      self.contentSizeForViewInPopover = CGSizeMake(320.0 600.0);
   }
   return self;
}

- (void)viewDidLoad {
   [super viewDidLoad];
   self.navigationItem.leftBarButtonItem = self.editButtonItem;

   UIBarButtonItem *addButton = [[UIBarButtonItem alloc] 
   initWithBarButtonSystemItem: UIBarButtonSystemItemAdd 
   target:self action:@selector(insertNewObject:)];
   self.navigationItem.rightBarButtonItem = addButton;
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   //处置任何可以重新创建的资源。
}

- (void)insertNewObject:(id)sender {
   if (!_objects) {
      _objects = [[NSMutableArray alloc] init];
   }
   
   [_objects insertObject:[NSDate date] atIndex:0];
   NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
   [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:
   UITableViewRowAnimationAutomatic];
}

#pragma mark - Table View

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
   return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:
   (NSInteger)section {
   return _objects.count;
}

//自定义表格视图单元格的外观。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:
   (NSIndexPath *)indexPath {
   static NSString *CellIdentifier = @"Cell";
   
   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
   CellIdentifier];
   
   if (cell == nil) {
      cell = [[UITableViewCell alloc] initWithStyle:
      UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
   }
   NSDate *object = _objects[indexPath.row];
   cell.textLabel.text = [object description];
   return cell;
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:
   (NSIndexPath *)indexPath {
   //如果您不希望指定的项目可编辑,则返回 NO。
   return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:
   (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:
   (NSIndexPath *)indexPath {
   
   if (editingStyle == UITableViewCellEditingStyleDelete) {
      [_objects removeObjectAtIndex:indexPath.row];
      [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:
      UITableViewRowAnimationFade];
   } else if (editingStyle == UITableViewCellEditingStyleInsert) {
      //创建相应类的新实例,将其插入
      //数组,并在表格视图中添加一个新行。
   }
}

/*
//Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:
   (NSIndexPath *) fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
}
*/

/*
//Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:
   (NSIndexPath *)indexPath {
   //如果您不希望该商品可重新订购,请返回 NO。
   return YES;
}
*/

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
   (NSIndexPath *)indexPath {
   NSDate *object = _objects[indexPath.row];
   self.detailViewController.detailItem = object;
   NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
   [formatter setDateFormat: @"yyyy-MM-dd HH:mm:ss zzz"];  
   NSString *stringFromDate = [formatter stringFromDate:object];
   self.detailViewController.detail描述Label.text = stringFromDate;
}
@end

步骤8 - DetailViewController.h如下-

#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController
<UISplitViewControllerDelegate>

@property (strong nonatomic) id detailItem;

@property (weak nonatomic) IBOutlet UILabel *detail描述Label;
@end

步骤9 - DetailViewController.m如下-

#import "DetailViewController.h"

@interface DetailViewController ()
@property (strong nonatomic) UIPopoverController *masterPopoverController;
- (void)configureView;
@end

@implementation DetailViewController

#pragma mark - Managing the detail item

- (void)setDetailItem:(id)newDetailItem {
   if (_detailItem != newDetailItem) {
      _detailItem = newDetailItem;
      
      //Update the view.
      [self configureView];
   }

   if (self.masterPopoverController != nil) {
      [self.masterPopoverController dismissPopoverAnimated:YES];
   }  
}

- (void)configureView {
   //更新详细信息项的用户界面。

   if (self.detailItem) {
      self.detailRemarkLabel.text = [self.detailItem description];
   }
}

- (void)viewDidLoad {
   [super viewDidLoad];
   [self configureView];
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   //处置任何可以重新创建的资源。
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:
   (NSBundle *)nibBundleOrNil {
   self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
   
   if (self) {
      self.title = NSLocalizedString(@"Detail" @"Detail");
   }
   return self;
}

#pragma mark - Split view

- (void)splitViewController:(UISplitViewController *)splitController 
   willHideViewController:(UIViewController *)viewController withBarButtonItem:
   (UIBarButtonItem *)barButtonItem forPopoverController:
   (UIPopoverController *)popoverController {
   barButtonItem.title = NSLocalizedString(@"Master" @"Master");
   [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
   self.masterPopoverController = popoverController;
}

- (void)splitViewController:(UISplitViewController *)splitController 
   willShowViewController:(UIViewController *)viewController 
   invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {
   //当视图在拆分视图中再次显示时调用,
   //使按钮和弹出框控制器无效。
   [self.navigationItem setLeftBarButtonItem:nil animated:YES];
   self.masterPopoverController = nil;
}
@end

步骤10 - 运行应用程序时,无涯教程将在横向模式下获得以下输出-

iOS Tutorial

步骤11 - 切换模式时,无涯教程将获得以下输出-

iOS Tutorial

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

10x程序员工作法 -〔郑晔〕

深入拆解Tomcat & Jetty -〔李号双〕

RPC实战与核心原理 -〔何小锋〕

编译原理实战课 -〔宫文学〕

体验设计案例课 -〔炒炒〕

打造爆款短视频 -〔周维〕

程序员的个人财富课 -〔王喆〕

编程高手必学的内存知识 -〔海纳〕

云原生基础架构实战课 -〔潘野〕

好记忆不如烂笔头。留下您的足迹吧 :)