Ios-ui-elements-splitview

提供:Dev Guides
移動先:案内検索

iOS-分割ビュー

分割ビューの使用

Split ViewはiPad固有のコンテナであり、2つのView Controllerを並べて管理するためのView Controller、左側のマスター、右側の詳細View Controllerです。

重要なプロパティ

  • 代表者
  • viewControllers

サンプルコードと手順

ステップ1 *-新しいプロジェクトを作成し、View Basedアプリケーションの代わりに *Master Detail Application を選択して、次をクリックし、プロジェクト名を指定してcreateを選択します。

  • ステップ2 *-マスターにテーブルビューがある単純なSplit View Controllerがデフォルトで作成されます。
  • ステップ3 *-ファイルは、View Basedアプリケーションとは少し異なります。 ここでは、次のファイルが作成されています。
  • 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.mdidFinishLaunchingWithOptions メソッドは次のとおりです-

- (BOOL)application:(UIApplication *)application
   didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
   self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen]bounds]];

  //Override point for customization after application launch.
   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は次のとおりです-
#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];
  //Dispose of any resources that can be recreated.
}

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

//Customize the appearance of table view cells.
- (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 {
  //Return NO if you do not want the specified item to be editable.
   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) {
     //Create a new instance of the appropriate class, insert it into
     //the array, and add a new row to the table view.
   }
}

/*
//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 {
  //Return NO if you do not want the item to be re-orderable.
   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.detailDescriptionLabel.text = stringFromDate;
}
@end
  • ステップ8 *-以下のDetailViewController.h-
#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController
<UISplitViewControllerDelegate>

@property (strong, nonatomic) id detailItem;

@property (weak, nonatomic) IBOutlet UILabel *detailDescriptionLabel;
@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 {
  //Update the user interface for the detail item.

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

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

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
  //Dispose of any resources that can be recreated.
}

- (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 {
  //Called when the view is shown again in the split view,
  //invalidating the button and popover controller.
   [self.navigationItem setLeftBarButtonItem:nil animated:YES];
   self.masterPopoverController = nil;
}
@end
  • ステップ10 *-アプリケーションを実行すると、ランドスケープモードで次の出力が得られます-

iOSチュートリアル

  • ステップ11 *-ポートレートモードに切り替えると、次の出力が得られます-

iOSチュートリアル