Drill Down Sample Code for iOS


![DrillDownExample.gif](https://qiita-image-store.s3.amazonaws.com/0/37755/56ee0748-dc83-55bf-92e7-610b391dbe22.gif "DrillDownExample.gif")

[GitHub](https://github.com/t-fuchi/DrillDownExample)

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

```objc:ViewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
@property UINavigationController *navController;
@end
```

```objc: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
```

```objc:ChildViewController.h
#import <UIKit/UIKit.h>

@interface ChildViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@property IBOutlet UITableView *tableView;
@end
```

```objc: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](https://qiita-image-store.s3.amazonaws.com/0/37755/a7136bb6-d1a8-70e6-d6b7-1c52bdf0046c.png "DrillDownExample.png")