Objective-C
iOS
UINavigationController

Drill Down Sample Code for iOS

More than 3 years have passed since last update.

DrillDownExample.gif

GitHub

ドリルダウン型のファイルマネージャを実装しようと思い、UINavigationControllerのサンプルコードを探したところ、単純なのを見つけられませんでした。仕方なく試行錯誤したところ、ドリルダウン部分はシンプルに実装できたので、参考のために公開します。xibファイルからUIViewControllerを生成する例にもなっています。

ViewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
@property UINavigationController *navController;
@end
ViewController.m
#import "ViewController.h"
#import "ChildViewController.h"

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    ChildViewController *childViewController
       = [[ChildViewController alloc] initWithNibName:@"ChildViewController" bundle:nil];
    childViewController.title = @"/";
    self.navController 
       = [[UINavigationController alloc] initWithRootViewController:childViewController];
}

- (IBAction)open:(id)sender
{
    [self presentViewController:self.navController
          animated:YES completion:nil];
}

@end
ChildViewController.h
#import <UIKit/UIKit.h>

@interface ChildViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@property IBOutlet UITableView *tableView;
@end
ChildViewController.m
#import "ChildViewController.h"

@implementation ChildViewController

- (IBAction)close:(id)sender
{
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
}

- (IBAction)swipeRight:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];
}

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

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 10;
}

- (NSString*) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return [NSString stringWithFormat:@"Section %d", section + 1];
}

- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if (!cell) {
        cell = [[UITableViewCell alloc]
                initWithStyle:UITableViewCellStyleDefault
                reuseIdentifier:@"Cell"];
    }
    cell.textLabel.text = [NSString stringWithFormat:@"%d-%d",
                           indexPath.section + 1, indexPath.row + 1];
    return cell;
}

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.selected = NO;
    ChildViewController *childViewController
       = [[ChildViewController alloc]
           initWithNibName:@"ChildViewController" bundle:nil];
    NSString *parent = self.navigation.prompt;
    if (!parent) parent = "/";
    childViewController.navigationItem.prompt
          = [parent stringByAppendingPathComponent:cell.textLabel.text];
    childViewController.title
        = [tableView cellForRowAtIndexPath:indexPath].textLabel.text;
    childViewController.navigationItem.rightBarButtonItem
        = [[UIBarButtonItem alloc]
             initWithTitle:@"Root"
                     style:UIBarButtonItemStyleBordered
                    target:self.navigationController
                    action:@selector(popToRootViewControllerAnimated:)];
    [self.navigationController
         pushViewController:childViewController animated:YES];
}

@end

肝はUIViewControllerのinitWithNibName:bundle:です。構成が変化するドリルダウンでは、いかに子供を生成するかが問題なのですが、UIViewControllerは簡単にxibファイルから生成できます。ナビゲーションバーのプロンプトにフルパスを表示するようにして、右側にはルートに戻るボタンを付けてみました。ちなみにxibファイルは以下の図を参考にしてください。
DrillDownExample.png