OSDN Git Service

Change detail view structure.
authorHirami <tomohisa.hirami@nifty.com>
Tue, 3 Apr 2012 10:03:47 +0000 (19:03 +0900)
committerHirami <tomohisa.hirami@nifty.com>
Tue, 3 Apr 2012 10:03:47 +0000 (19:03 +0900)
15 files changed:
iOS/Tombo/Tombo.xcodeproj/project.pbxproj
iOS/Tombo/Tombo/CustomSegue.h [deleted file]
iOS/Tombo/Tombo/CustomSegue.m [deleted file]
iOS/Tombo/Tombo/DetailViewController.h
iOS/Tombo/Tombo/DetailViewController.m
iOS/Tombo/Tombo/EditCancelAlert.h [new file with mode: 0644]
iOS/Tombo/Tombo/EditCancelAlert.m [new file with mode: 0644]
iOS/Tombo/Tombo/EditViewController.h [new file with mode: 0644]
iOS/Tombo/Tombo/EditViewController.m [new file with mode: 0644]
iOS/Tombo/Tombo/FileItem.h
iOS/Tombo/Tombo/FileItem.m
iOS/Tombo/Tombo/MasterViewController.h
iOS/Tombo/Tombo/MasterViewController.m
iOS/Tombo/Tombo/en.lproj/MainStoryboard_iPad.storyboard
iOS/Tombo/Tombo/en.lproj/MainStoryboard_iPhone.storyboard

index 4226a57..af4575d 100644 (file)
@@ -7,6 +7,9 @@
        objects = {
 
 /* Begin PBXBuildFile section */
+               9228CF2815298F7200E20355 /* EditCancelAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 9228CF2715298F7200E20355 /* EditCancelAlert.m */; };
+               922F592A15295FAA009B1E32 /* EditViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 922F592915295FAA009B1E32 /* EditViewController.m */; };
+               9243C7B51529D8610092B506 /* DetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9243C7B41529D8610092B506 /* DetailViewController.m */; };
                92DE332D151E277D00AD06EC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92DE332C151E277D00AD06EC /* UIKit.framework */; };
                92DE332F151E277D00AD06EC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92DE332E151E277D00AD06EC /* Foundation.framework */; };
                92DE3331151E277D00AD06EC /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92DE3330151E277D00AD06EC /* CoreGraphics.framework */; };
                92DE3340151E277D00AD06EC /* MainStoryboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 92DE333E151E277D00AD06EC /* MainStoryboard_iPhone.storyboard */; };
                92DE3343151E277D00AD06EC /* MainStoryboard_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 92DE3341151E277D00AD06EC /* MainStoryboard_iPad.storyboard */; };
                92DE3346151E277D00AD06EC /* MasterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 92DE3345151E277D00AD06EC /* MasterViewController.m */; };
-               92DE3349151E277D00AD06EC /* DetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 92DE3348151E277D00AD06EC /* DetailViewController.m */; };
                92DE3351151E277E00AD06EC /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92DE3350151E277E00AD06EC /* SenTestingKit.framework */; };
                92DE3352151E277E00AD06EC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92DE332C151E277D00AD06EC /* UIKit.framework */; };
                92DE3353151E277E00AD06EC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92DE332E151E277D00AD06EC /* Foundation.framework */; };
                92DE335B151E277E00AD06EC /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 92DE3359151E277E00AD06EC /* InfoPlist.strings */; };
                92DE335E151E277E00AD06EC /* TomboTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 92DE335D151E277E00AD06EC /* TomboTests.m */; };
                92DE33861522998700AD06EC /* Storage.m in Sources */ = {isa = PBXBuildFile; fileRef = 92DE33851522998700AD06EC /* Storage.m */; };
-               92DE338D1522F61200AD06EC /* CustomSegue.m in Sources */ = {isa = PBXBuildFile; fileRef = 92DE338C1522F61200AD06EC /* CustomSegue.m */; };
                92DE33901522FFEC00AD06EC /* FileItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 92DE338F1522FFEB00AD06EC /* FileItem.m */; };
                92DE339F15231CFC00AD06EC /* Folder-32.png in Resources */ = {isa = PBXBuildFile; fileRef = 92DE339B15231CFC00AD06EC /* Folder-32.png */; };
                92DE33A015231CFC00AD06EC /* Folder-48.png in Resources */ = {isa = PBXBuildFile; fileRef = 92DE339C15231CFC00AD06EC /* Folder-48.png */; };
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
+               9228CF2615298F7200E20355 /* EditCancelAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditCancelAlert.h; sourceTree = "<group>"; };
+               9228CF2715298F7200E20355 /* EditCancelAlert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EditCancelAlert.m; sourceTree = "<group>"; };
+               922F592815295FAA009B1E32 /* EditViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditViewController.h; sourceTree = "<group>"; };
+               922F592915295FAA009B1E32 /* EditViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EditViewController.m; sourceTree = "<group>"; };
+               9243C7B31529D8610092B506 /* DetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DetailViewController.h; sourceTree = "<group>"; };
+               9243C7B41529D8610092B506 /* DetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DetailViewController.m; sourceTree = "<group>"; };
                92DE3328151E277D00AD06EC /* Tombo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tombo.app; sourceTree = BUILT_PRODUCTS_DIR; };
                92DE332C151E277D00AD06EC /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
                92DE332E151E277D00AD06EC /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
@@ -58,8 +65,6 @@
                92DE3342151E277D00AD06EC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPad.storyboard; sourceTree = "<group>"; };
                92DE3344151E277D00AD06EC /* MasterViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MasterViewController.h; sourceTree = "<group>"; };
                92DE3345151E277D00AD06EC /* MasterViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MasterViewController.m; sourceTree = "<group>"; };
-               92DE3347151E277D00AD06EC /* DetailViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DetailViewController.h; sourceTree = "<group>"; };
-               92DE3348151E277D00AD06EC /* DetailViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DetailViewController.m; sourceTree = "<group>"; };
                92DE334F151E277E00AD06EC /* TomboTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TomboTests.octest; sourceTree = BUILT_PRODUCTS_DIR; };
                92DE3350151E277E00AD06EC /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };
                92DE3358151E277E00AD06EC /* TomboTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TomboTests-Info.plist"; sourceTree = "<group>"; };
@@ -68,8 +73,6 @@
                92DE335D151E277E00AD06EC /* TomboTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TomboTests.m; sourceTree = "<group>"; };
                92DE33841522998700AD06EC /* Storage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Storage.h; sourceTree = "<group>"; };
                92DE33851522998700AD06EC /* Storage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Storage.m; sourceTree = "<group>"; };
-               92DE338B1522F61200AD06EC /* CustomSegue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomSegue.h; sourceTree = "<group>"; };
-               92DE338C1522F61200AD06EC /* CustomSegue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomSegue.m; sourceTree = "<group>"; };
                92DE338E1522FFEB00AD06EC /* FileItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileItem.h; sourceTree = "<group>"; };
                92DE338F1522FFEB00AD06EC /* FileItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FileItem.m; sourceTree = "<group>"; };
                92DE339B15231CFC00AD06EC /* Folder-32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Folder-32.png"; sourceTree = "<group>"; };
                                92DE3341151E277D00AD06EC /* MainStoryboard_iPad.storyboard */,
                                92DE3344151E277D00AD06EC /* MasterViewController.h */,
                                92DE3345151E277D00AD06EC /* MasterViewController.m */,
-                               92DE3347151E277D00AD06EC /* DetailViewController.h */,
-                               92DE3348151E277D00AD06EC /* DetailViewController.m */,
+                               922F592815295FAA009B1E32 /* EditViewController.h */,
+                               922F592915295FAA009B1E32 /* EditViewController.m */,
+                               9228CF2615298F7200E20355 /* EditCancelAlert.h */,
+                               9228CF2715298F7200E20355 /* EditCancelAlert.m */,
                                92DE3333151E277D00AD06EC /* Supporting Files */,
                                92DE33841522998700AD06EC /* Storage.h */,
                                92DE33851522998700AD06EC /* Storage.m */,
                                92DE338E1522FFEB00AD06EC /* FileItem.h */,
                                92DE338F1522FFEB00AD06EC /* FileItem.m */,
-                               92DE338B1522F61200AD06EC /* CustomSegue.h */,
-                               92DE338C1522F61200AD06EC /* CustomSegue.m */,
+                               9243C7B31529D8610092B506 /* DetailViewController.h */,
+                               9243C7B41529D8610092B506 /* DetailViewController.m */,
                        );
                        path = Tombo;
                        sourceTree = "<group>";
                                92DE3339151E277D00AD06EC /* main.m in Sources */,
                                92DE333D151E277D00AD06EC /* AppDelegate.m in Sources */,
                                92DE3346151E277D00AD06EC /* MasterViewController.m in Sources */,
-                               92DE3349151E277D00AD06EC /* DetailViewController.m in Sources */,
                                92DE33861522998700AD06EC /* Storage.m in Sources */,
-                               92DE338D1522F61200AD06EC /* CustomSegue.m in Sources */,
                                92DE33901522FFEC00AD06EC /* FileItem.m in Sources */,
+                               922F592A15295FAA009B1E32 /* EditViewController.m in Sources */,
+                               9228CF2815298F7200E20355 /* EditCancelAlert.m in Sources */,
+                               9243C7B51529D8610092B506 /* DetailViewController.m in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
diff --git a/iOS/Tombo/Tombo/CustomSegue.h b/iOS/Tombo/Tombo/CustomSegue.h
deleted file mode 100644 (file)
index d32afd5..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/* 
- * Custom segue
- * 
- * if isStop is set to YES, transition is disabled.
- * This segue is used by MainStoryboard_iPhone.
- */
-#import <UIKit/UIKit.h>
-
-@interface CustomSegue : UIStoryboardSegue
-
-@property BOOL isStop;
-
-@end
diff --git a/iOS/Tombo/Tombo/CustomSegue.m b/iOS/Tombo/Tombo/CustomSegue.m
deleted file mode 100644 (file)
index bc33d24..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#import "CustomSegue.h"
-
-@implementation CustomSegue
-
-@synthesize isStop;
-
-- (void)perform {
-    if (self.isStop) return;
-    
-    UINavigationController *ctrl = [self.sourceViewController navigationController];
-    [ctrl pushViewController:self.destinationViewController 
-                    animated:YES];
-}
-@end
index 43611c0..3d21b6b 100644 (file)
@@ -1,12 +1,17 @@
 #import <UIKit/UIKit.h>
 #import "FileItem.h"
-#import "Storage.h"
 
-@interface DetailViewController : UIViewController <UISplitViewControllerDelegate,UITextViewDelegate>
+@class MasterViewController;
+/*
+ * Right pane of split view.
+ * Used on iPad only.
+ */
 
-@property (strong, nonatomic) FileItem *detailItem;
-@property (strong, nonatomic) Storage *storage;
+@interface DetailViewController : UIViewController
 
-@property (weak, nonatomic) IBOutlet UITextView *detailText;
+@property (strong, nonatomic) FileItem *item;
+@property (weak, nonatomic) MasterViewController *master;
+
+@property (weak, nonatomic) IBOutlet UITextView *text;
 
 @end
index 5f29609..3b003c7 100644 (file)
 #import "DetailViewController.h"
+#import "EditViewController.h"
 #import "MasterViewController.h"
 
-@interface DetailViewController () {
-    BOOL isModify;
-}
-@property (strong, nonatomic) UIPopoverController *masterPopoverController;
-- (void)configureView;
+@interface DetailViewController ()
+
 @end
 
 @implementation DetailViewController
+@synthesize text = _text;
+@synthesize item = _item;
+@synthesize master = _master;
 
-@synthesize detailItem = _detailItem;
-@synthesize storage;
-@synthesize detailText = _detailText;
-@synthesize masterPopoverController = _masterPopoverController;
-
-#pragma mark - Managing the detail item
-
-- (void)setDetailItem:(id)newDetailItem
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
 {
-    if (_detailItem != newDetailItem) {
-        // save current note
-        [self save];
-        
-        // set item
-        _detailItem = newDetailItem;
-        
-        // Update the view.
-        [self configureView];
+    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+    if (self) {
+        // Custom initialization
     }
-
-    if (self.masterPopoverController != nil) {
-        [self.masterPopoverController dismissPopoverAnimated:YES];
-    }        
-}
-
-- (void)configureView
-{
-    NSString *noteData;
-    if (self.detailItem && self.detailItem.path) {
-        NSError *error;
-        noteData = [NSString stringWithContentsOfFile:self.detailItem.path 
-                                             encoding:NSUTF8StringEncoding
-                                                error:&error];
-        if (error) return;
-    } else {
-        noteData = @"";
-    }
-    self.detailText.text = noteData;
+    return self;
 }
 
 - (void)viewDidLoad
 {
     [super viewDidLoad];
-       // Do any additional setup after loading the view, typically from a nib.
-    NSNotificationCenter *notify = [NSNotificationCenter defaultCenter];
-    [notify addObserver:self 
-               selector:@selector(keyboardDidShow:) 
-                   name:UIKeyboardDidShowNotification 
-                 object:nil];
-    
-    [notify addObserver:self
-               selector:@selector(keyboardDidHide:)
-                   name:UIKeyboardDidHideNotification
-                 object:nil];
-
-    self.detailText.delegate = self;
-    [self configureView];
-    isModify = NO;
+       // Do any additional setup after loading the view.
 }
 
 - (void)viewDidUnload
 {
-    [self setDetailText:nil];
-    self.detailItem = nil;
-    self.storage = nil;
+    [self setText:nil];
     [super viewDidUnload];
-}
-
-- (void)viewWillDisappear:(BOOL)animated {
-    // Leaving detail view
-    [self save];
-    [super viewWillDisappear: animated];
+    // Release any retained subviews of the main view.
 }
 
 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
 {
-    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
-        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
-    } else {
-        return YES;
-    }
+       return YES;
 }
 
-- (void)textViewDidChange:(UITextView *)textView {
-    isModify = YES;
-}
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    if ([[segue identifier] isEqualToString:@"editNote"]) {
+        EditViewController *edit = (EditViewController*)[[[segue destinationViewController] viewControllers] objectAtIndex:0];
+        edit.detailItem = self.item;
+        edit.delegate = self.master;
 
-- (void)save {
-    if (!isModify) return;
-    
-    NSString *note = self.detailText.text;    
-    FileItem *newPath = [storage save:note item: self.detailItem];
-    isModify = NO;
-    
-    MasterViewController *master;
-    
-    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
-        UINavigationController *v = [self.splitViewController.viewControllers objectAtIndex:0];
-        NSArray *a = v.viewControllers;
-        master = [a objectAtIndex:0];
-    } else {
-        // To notify master view, retract reference from navigation controller.
-        master = [self.navigationController.viewControllers objectAtIndex:0];
-    }
-    
-    if (self.detailItem.name) {
-        // item exists
-        if (self.detailItem != newPath) {
-            [master itemChanged: self.detailItem to:newPath];
-        }
-    } else {
-        // new item
-        [master itemAdded: newPath];
     }
 }
 
-#pragma mark - Notification handler
-
-- (void)keyboardDidShow:(NSNotification*)notification {
-    NSDictionary *info = [notification userInfo];
-    
-    CGRect beginRect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] fromView:nil];
-    CGRect rect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
-    CGRect frame = self.detailText.frame;
-    
-    if (beginRect.size.height == rect.size.height) {
-        // slide in
-        frame.size.height -= rect.size.height;
+- (void)setItem:(FileItem *)item {
+    if (self.item == item) return;
+    if (item.isNewItem) {
+        self.text.text = @"";
     } else {
-        // keyboard change
-        frame.size.height -= (rect.size.height - beginRect.size.height);
+        NSError *error;
+        NSString *note = [NSString stringWithContentsOfFile:item.path
+                                                   encoding:NSUTF8StringEncoding
+                                                      error:&error];
+        if (error) {
+            self.text.text = @"";
+        } else {
+            self.text.text = note;
+        }
     }
-    self.detailText.frame = frame;
-
-}
-
-- (void)keyboardDidHide:(NSNotification*)notification {
-
-    NSDictionary *info = [notification userInfo];
-    
-    CGRect rect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
-    CGRect frame = self.detailText.frame;
-
-    frame.size.height += rect.size.height;
-    self.detailText.frame = frame;
-}
-
-#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;
+    _item = item;
 }
-
-- (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
diff --git a/iOS/Tombo/Tombo/EditCancelAlert.h b/iOS/Tombo/Tombo/EditCancelAlert.h
new file mode 100644 (file)
index 0000000..c197799
--- /dev/null
@@ -0,0 +1,4 @@
+#import <UIKit/UIKit.h>
+
+@interface EditCancelAlert : UIAlertView
+@end
diff --git a/iOS/Tombo/Tombo/EditCancelAlert.m b/iOS/Tombo/Tombo/EditCancelAlert.m
new file mode 100644 (file)
index 0000000..8cb0468
--- /dev/null
@@ -0,0 +1,4 @@
+#import "EditCancelAlert.h"
+
+@implementation EditCancelAlert
+@end
diff --git a/iOS/Tombo/Tombo/EditViewController.h b/iOS/Tombo/Tombo/EditViewController.h
new file mode 100644 (file)
index 0000000..c459075
--- /dev/null
@@ -0,0 +1,23 @@
+#import <UIKit/UIKit.h>
+#import "FileItem.h"
+#import "Storage.h"
+
+@protocol EditViewControllerDelegate;
+
+@interface EditViewController : UIViewController <UITextViewDelegate>
+
+@property (weak, nonatomic) id <EditViewControllerDelegate> delegate;
+@property (strong, nonatomic) FileItem *detailItem;
+@property (nonatomic) BOOL isModify;
+
+@property (weak, nonatomic) IBOutlet UITextView *detailText;
+
+- (IBAction)done:(id)sender;
+- (IBAction)cancel:(id)sender;
+
+@end
+
+@protocol EditViewControllerDelegate <NSObject>
+- (void)editViewControllerDidCancel:(EditViewController*)controller;
+- (void)editViewControllerDidFinish:(EditViewController *)controller;
+@end
\ No newline at end of file
diff --git a/iOS/Tombo/Tombo/EditViewController.m b/iOS/Tombo/Tombo/EditViewController.m
new file mode 100644 (file)
index 0000000..2d8af11
--- /dev/null
@@ -0,0 +1,126 @@
+#import "EditViewController.h"
+#import "MasterViewController.h"
+
+@interface EditViewController () {
+}
+@end
+
+@implementation EditViewController
+
+@synthesize detailItem = _detailItem;
+@synthesize detailText = _detalText;
+@synthesize delegate = _delegate;
+@synthesize isModify = _isModify;
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+    if (self) {
+        // Custom initialization
+    }
+    return self;
+}
+
+- (void)setDetailItem:(id)newDetailItem
+{
+    if (_detailItem != newDetailItem) {
+        // set item
+        _detailItem = newDetailItem;
+        
+        // Update the view.
+        [self configureView];
+    }
+}
+
+- (void)configureView {
+    NSString *noteData;
+    if (self.detailItem && self.detailItem.path) {
+        NSError *error;
+        noteData = [NSString stringWithContentsOfFile:self.detailItem.path 
+                                             encoding:NSUTF8StringEncoding
+                                                error:&error];
+        if (error) return;
+    } else {
+        noteData = @"";
+    }
+    self.detailText.text = noteData;
+}
+
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+       // Do any additional setup after loading the view, typically from a nib.
+    NSNotificationCenter *notify = [NSNotificationCenter defaultCenter];
+    [notify addObserver:self 
+               selector:@selector(keyboardDidShow:) 
+                   name:UIKeyboardDidShowNotification 
+                 object:nil];
+    
+    [notify addObserver:self
+               selector:@selector(keyboardDidHide:)
+                   name:UIKeyboardDidHideNotification
+                 object:nil];
+    
+    self.detailText.delegate = self;
+    [self configureView];
+    self.isModify = NO;
+}
+
+- (void)viewDidUnload {
+    [self setDetailText:nil];
+    self.detailItem = nil;
+    [super viewDidUnload];    
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
+    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
+        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
+    } else {
+        return YES;
+    }
+}
+- (void)textViewDidChange:(UITextView *)textView {
+    self.isModify = YES;
+}
+
+#pragma mark - Notification handler
+
+- (void)keyboardDidShow:(NSNotification*)notification {
+    NSDictionary *info = [notification userInfo];
+    
+    CGRect beginRect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] fromView:nil];
+    CGRect rect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
+    CGRect frame = self.detailText.frame;
+    
+    if (beginRect.size.height == rect.size.height) {
+        // slide in
+        frame.size.height -= rect.size.height;
+    } else {
+        // keyboard change
+        frame.size.height -= (rect.size.height - beginRect.size.height);
+    }
+    self.detailText.frame = frame;
+    
+}
+
+- (void)keyboardDidHide:(NSNotification*)notification {
+    
+    NSDictionary *info = [notification userInfo];
+    
+    CGRect rect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
+    CGRect frame = self.detailText.frame;
+    
+    frame.size.height += rect.size.height;
+    self.detailText.frame = frame;
+}
+
+#pragma mark - Action handler
+
+- (IBAction)cancel:(id)sender {
+    [[self delegate] editViewControllerDidCancel:self];
+}
+- (IBAction)done:(id)sender {
+    [[self delegate] editViewControllerDidFinish:self];
+}
+
+@end
index d5c2535..1a53d2c 100644 (file)
@@ -13,4 +13,6 @@
 
 +(id)allocWithName:(NSString *)name;
 
+- (BOOL)isNewItem;
+
 @end
index 08eb0dc..6978c53 100644 (file)
@@ -19,4 +19,7 @@
     return fileItem;
 }
 
+- (BOOL)isNewItem {
+    return self.name == nil;
+}
 @end
index 72f22d9..34a9f25 100644 (file)
@@ -1,13 +1,9 @@
 #import <UIKit/UIKit.h>
 #import "FileItem.h"
-
+#import "EditViewController.h"
 @class DetailViewController;
 
-@interface MasterViewController : UITableViewController
+@interface MasterViewController : UITableViewController <EditViewControllerDelegate>
 
 @property (strong, nonatomic) DetailViewController *detailViewController;
-
-// Call back handler for detail view.
-- (void)itemChanged:(FileItem *)from to:(FileItem *)to;
-- (void)itemAdded: (FileItem *)item;
 @end
index 8ab79c6..e12687f 100644 (file)
@@ -1,11 +1,12 @@
 #import "MasterViewController.h"
+#import "EditViewController.h"
 #import "DetailViewController.h"
+#import "EditCancelAlert.h"
 
 #import "Storage.h"
-#import "CustomSegue.h"
 #import "FileItem.h"
 
-@interface MasterViewController () {
+@interface MasterViewController () <UIAlertViewDelegate, UITableViewDelegate> {
     NSMutableArray *_objects;
     Storage *storage;
     
 {
     [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
-//    self.navigationItem.leftBarButtonItem = self.editButtonItem;
-
-    UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
-                                                                               target:self
-                                                                               action:@selector(openNewNote:)];
-    self.navigationItem.rightBarButtonItem = addButton;
     self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];
-
+    self.detailViewController.master = self;
+    
     imgFolder = nil;
     imgDocument = nil;
     if (!storage) {
         storage = [Storage init];
     }
-    self.detailViewController.storage = storage;
-    self.detailViewController.detailItem = [storage newItem];
     
     // Load initial items.
     [self insertItems];
@@ -75,8 +69,6 @@
         [self performSegueWithIdentifier:@"newNote" sender:self];
     } else {
         // iPad : Clear detail view.
-        [self.detailViewController setDetailItem:nil];
-        
     }
 }
 
 }
 */
 
-- (void)transitDetailView:(NSIndexPath *)indexPath controller:(DetailViewController*)controller {
+// Select Row(iPhone/iPad)
+// set item for iPad
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+//    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
+//        [self transitDetailView:indexPath controller:self.detailViewController];
+//    }
     FileItem *item = [_objects objectAtIndex:indexPath.row];
     if (item.isUp) {
         // switch view items
         [self removeAllItems];
         [storage updir];
-        [self insertItems];
+        [self insertItems];        
     } else if (item.isDirectory) {
-        // switch view items
         [self removeAllItems];
         [storage chdir: item.name];
-        [self insertItems];
-        
+        [self insertItems];        
     } else {
-        [controller setDetailItem:item];
-        [controller setStorage: storage];
-    }
-    
-}
-
-// Select Row(iPhone/iPad)
-// set item for iPad
-- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
-{
-    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
-        [self transitDetailView:indexPath controller:self.detailViewController];
+        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
+            self.detailViewController.item = item;
+        } else {
+            [self performSegueWithIdentifier:@"editNote" sender:self];
+        }
     }
 }
 
 // set item (for iPhone)
 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
 {
-    if ([[segue identifier] isEqualToString:@"showDetail"]) {
-        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];         
+    if ([[segue identifier] isEqualToString:@"newNote"]) {
+        EditViewController *edit = (EditViewController*)[[[segue destinationViewController] viewControllers] objectAtIndex:0];
+        edit.detailItem = [storage newItem];
+        edit.delegate = self;
+    } else if ([[segue identifier] isEqualToString:@"editNote"]) {
+        // This path is used only iPhone
+        EditViewController *edit = (EditViewController*)[[[segue destinationViewController] viewControllers] objectAtIndex:0];
+        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
         FileItem *item = [_objects objectAtIndex:indexPath.row];
-        if (item.isUp || item.isDirectory) {
-            CustomSegue *customSegue = (CustomSegue*)segue;
-            customSegue.isStop = YES;            
+        edit.detailItem = item;
+        edit.delegate = self;
+    }
+}
+
+#pragma mark - EditViewControllerDelegate
+
+- (void)editViewControllerDidFinish:(EditViewController *)controller {
+    if (controller.isModify) {
+        // save note
+        if (![controller.detailItem isNewItem]) {
+            [self deleteItem:controller.detailItem];
         }
-        [self transitDetailView:indexPath controller:[segue destinationViewController]];
-    } else if ([[segue identifier] isEqualToString:@"newNote"]) {
-        // When open new document, detailItem is newItem.
-        DetailViewController *detail = [segue destinationViewController];        
-        detail.detailItem = [storage newItem];
-        detail.storage = storage;
+        NSString *note = controller.detailText.text;
+        FileItem *item = [storage save:note item:controller.detailItem];
+        controller.isModify = NO;
+        
+        self.detailViewController.item = item;
+
+        [self insertItem:item];
     }
+    [self dismissModalViewControllerAnimated:YES];
 }
 
-- (void)itemChanged:(FileItem *)from to:(FileItem *)to {
-    // Remove old item and insert new item
-    [self deleteItem: from];
-    [self insertItem: to];
+- (void)editViewControllerDidCancel:(EditViewController *)controller {
+    if (controller.isModify) {
+        UIAlertView *alert = [[EditCancelAlert alloc] initWithTitle:@"Confirm" 
+                                                        message:@"Note is modified. Are you sure to discard changes?" delegate:self 
+                                              cancelButtonTitle:@"OK"
+                                              otherButtonTitles:@"Cancel", nil];
+        [alert show];
+    } else {
+        [self dismissModalViewControllerAnimated:YES];                
+    }
 }
 
-- (void)itemAdded:(FileItem *)item {
-    // Simply insert a item.
-    [self insertItem: item];
+#pragma mark - AlertViewDelegate
+
+-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
+    if ([alertView isKindOfClass:[EditCancelAlert class]]) {
+        if (buttonIndex == 0) {
+            [self dismissModalViewControllerAnimated:YES];        
+        }
+    }
 }
 @end
index 0810370..dc63205 100644 (file)
@@ -3,7 +3,7 @@
     <dependencies>
         <deployment defaultVersion="1296" identifier="iOS"/>
         <development defaultVersion="4200" identifier="xcode"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="1179"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="1181"/>
     </dependencies>
     <scenes>
         <!--Navigation Controller-->
@@ -19,7 +19,7 @@
                     </connections>
                 </navigationController>
             </objects>
-            <point key="canvasLocation" x="448" y="-630"/>
+            <point key="canvasLocation" x="116" y="-494"/>
         </scene>
         <!--Detail View Controller - Detail-->
         <scene sceneID="16">
@@ -30,7 +30,7 @@
                         <rect key="frame" x="0.0" y="64" width="703" height="704"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
-                            <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" id="I5K-hl-l4m">
+                            <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" editable="NO" id="I5K-hl-l4m">
                                 <rect key="frame" x="0.0" y="0.0" width="703" height="704"/>
                                 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                 <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
                         <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
                     </view>
                     <toolbarItems/>
-                    <navigationItem key="navigationItem" title="Detail" id="53"/>
+                    <navigationItem key="navigationItem" title="Detail" id="53">
+                        <barButtonItem key="rightBarButtonItem" systemItem="edit" id="9dq-bI-Dm0">
+                            <connections>
+                                <segue destination="rXN-9x-iCW" kind="modal" identifier="editNote" id="Kjf-1o-2Ik"/>
+                            </connections>
+                        </barButtonItem>
+                    </navigationItem>
                     <connections>
-                        <outlet property="detailText" destination="I5K-hl-l4m" id="Mze-kK-DLs"/>
+                        <outlet property="text" destination="I5K-hl-l4m" id="efg-OY-fpX"/>
                     </connections>
                 </viewController>
             </objects>
-            <point key="canvasLocation" x="448" y="248"/>
+            <point key="canvasLocation" x="1025" y="-1397"/>
         </scene>
         <!--Split View Controller-->
         <scene sceneID="18">
@@ -64,7 +70,7 @@
                     </connections>
                 </splitViewController>
             </objects>
-            <point key="canvasLocation" x="-687" y="-630"/>
+            <point key="canvasLocation" x="-1135" y="-950"/>
         </scene>
         <!--Master View Controller - Master-->
         <scene sceneID="24">
                             <outlet property="delegate" destination="19" id="21"/>
                         </connections>
                     </tableView>
-                    <navigationItem key="navigationItem" title="Master" id="40"/>
+                    <navigationItem key="navigationItem" title="Master" id="40">
+                        <barButtonItem key="rightBarButtonItem" systemItem="add" id="J5P-yO-cEM">
+                            <connections>
+                                <segue destination="rXN-9x-iCW" kind="modal" identifier="newNote" id="pK5-mO-z6F"/>
+                            </connections>
+                        </barButtonItem>
+                    </navigationItem>
                 </tableViewController>
             </objects>
-            <point key="canvasLocation" x="859" y="-631"/>
+            <point key="canvasLocation" x="527" y="-495"/>
+        </scene>
+        <!--Edit View Controller-->
+        <scene sceneID="iZX-2r-fjn">
+            <objects>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="5BA-Ef-J8x" userLabel="First Responder" sceneMemberID="firstResponder"/>
+                <viewController id="bDQ-AH-j4Y" customClass="EditViewController" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="5tE-qu-kqz">
+                        <rect key="frame" x="0.0" y="64" width="1024" height="704"/>
+                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                        <subviews>
+                            <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" id="si7-dS-nro">
+                                <rect key="frame" x="0.0" y="0.0" width="1024" height="704"/>
+                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
+                            </textView>
+                        </subviews>
+                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+                        <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
+                    </view>
+                    <navigationItem key="navigationItem" id="sUV-LL-8ot">
+                        <barButtonItem key="leftBarButtonItem" systemItem="cancel" id="eka-xh-Nup">
+                            <connections>
+                                <action selector="cancel:" destination="bDQ-AH-j4Y" id="Nwu-CN-MDQ"/>
+                            </connections>
+                        </barButtonItem>
+                        <barButtonItem key="rightBarButtonItem" systemItem="done" id="Wbk-WE-vas">
+                            <connections>
+                                <action selector="done:" destination="bDQ-AH-j4Y" id="PR7-VL-kO8"/>
+                            </connections>
+                        </barButtonItem>
+                    </navigationItem>
+                    <connections>
+                        <outlet property="detailText" destination="si7-dS-nro" id="Cyl-Qi-jTW"/>
+                    </connections>
+                </viewController>
+            </objects>
+            <point key="canvasLocation" x="1994" y="490"/>
         </scene>
         <!--Navigation Controller-->
         <scene sceneID="50">
                     </connections>
                 </navigationController>
             </objects>
-            <point key="canvasLocation" x="-366" y="248"/>
+            <point key="canvasLocation" x="116" y="-1397"/>
+        </scene>
+        <!--Navigation Controller-->
+        <scene sceneID="rOf-2X-6ce">
+            <objects>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="JBX-0N-sNc" userLabel="First Responder" sceneMemberID="firstResponder"/>
+                <navigationController id="rXN-9x-iCW" sceneMemberID="viewController">
+                    <toolbarItems/>
+                    <navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="iYu-AH-jaY">
+                        <rect key="frame" x="0.0" y="0.0" width="768" height="44"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                    </navigationBar>
+                    <nil name="viewControllers"/>
+                    <connections>
+                        <segue destination="bDQ-AH-j4Y" kind="relationship" relationship="rootViewController" id="HpA-Et-NYA"/>
+                    </connections>
+                </navigationController>
+            </objects>
+            <point key="canvasLocation" x="1025" y="-494"/>
         </scene>
     </scenes>
+    <classes>
+        <class className="DetailViewController" superclassName="UIViewController">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/DetailViewController.h"/>
+            <relationships>
+                <relationship kind="outlet" name="text" candidateClass="UITextView"/>
+            </relationships>
+        </class>
+        <class className="EditViewController" superclassName="UIViewController">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/EditViewController.h"/>
+            <relationships>
+                <relationship kind="action" name="cancel:"/>
+                <relationship kind="action" name="done:"/>
+                <relationship kind="outlet" name="detailText" candidateClass="UITextView"/>
+            </relationships>
+        </class>
+        <class className="MasterViewController" superclassName="UITableViewController">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/MasterViewController.h"/>
+        </class>
+    </classes>
     <simulatedMetricsContainer key="defaultSimulatedMetrics">
         <simulatedStatusBarMetrics key="statusBar" statusBarStyle="blackTranslucent"/>
         <simulatedOrientationMetrics key="orientation"/>
         <simulatedScreenMetrics key="destination"/>
     </simulatedMetricsContainer>
+    <inferredMetricsTieBreakers>
+        <segue reference="Kjf-1o-2Ik"/>
+    </inferredMetricsTieBreakers>
 </document>
\ No newline at end of file
index 8a1c230..01b4d95 100644 (file)
@@ -49,9 +49,6 @@
                                     <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
                                 </view>
                                 <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
-                                <connections>
-                                    <segue destination="21" kind="custom" identifier="showDetail" customClass="CustomSegue" id="jZb-fq-zAk"/>
-                                </connections>
                             </tableViewCell>
                         </prototypes>
                         <sections/>
                             <outlet property="delegate" destination="12" id="15"/>
                         </connections>
                     </tableView>
-                    <navigationItem key="navigationItem" title="Master" id="36"/>
+                    <navigationItem key="navigationItem" title="Master" id="36">
+                        <barButtonItem key="rightBarButtonItem" systemItem="add" id="agb-4g-a59">
+                            <connections>
+                                <segue destination="7bR-lH-lJ9" kind="modal" identifier="newNote" id="HlC-by-ur5"/>
+                            </connections>
+                        </barButtonItem>
+                    </navigationItem>
                     <connections>
-                        <segue destination="21" kind="push" identifier="newNote" id="0ct-gM-2FR"/>
+                        <segue destination="7bR-lH-lJ9" kind="modal" identifier="editNote" id="aht-5S-Kxw"/>
                     </connections>
                 </tableViewController>
             </objects>
             <point key="canvasLocation" x="459" y="64"/>
         </scene>
-        <!--Detail View Controller - Detail-->
-        <scene sceneID="24">
+        <!--Edit View Controller-->
+        <scene sceneID="bJI-fW-9UV">
             <objects>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="23" sceneMemberID="firstResponder"/>
-                <viewController storyboardIdentifier="" title="Detail" id="21" customClass="DetailViewController" sceneMemberID="viewController">
-                    <view key="view" contentMode="scaleToFill" id="22">
+                <placeholder placeholderIdentifier="IBFirstResponder" id="dlo-yF-tdt" userLabel="First Responder" sceneMemberID="firstResponder"/>
+                <viewController id="Rsp-rs-tJf" customClass="EditViewController" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="ZAM-9z-zxC">
                         <rect key="frame" x="0.0" y="64" width="320" height="416"/>
                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                         <subviews>
-                            <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="dcM-3R-DB6">
+                            <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="Xrk-0H-B8o">
                                 <rect key="frame" x="0.0" y="0.0" width="320" height="416"/>
                                 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                 <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
                         </subviews>
                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
                     </view>
-                    <navigationItem key="navigationItem" title="Detail" id="26"/>
+                    <navigationItem key="navigationItem" id="euJ-qc-bbH">
+                        <barButtonItem key="leftBarButtonItem" systemItem="cancel" id="kPQ-0x-DwA">
+                            <connections>
+                                <action selector="cancel:" destination="Rsp-rs-tJf" id="JJ8-d2-ftv"/>
+                            </connections>
+                        </barButtonItem>
+                        <barButtonItem key="rightBarButtonItem" systemItem="done" id="5xl-w3-ddR">
+                            <connections>
+                                <action selector="done:" destination="Rsp-rs-tJf" id="R7k-Mi-Ig3"/>
+                            </connections>
+                        </barButtonItem>
+                    </navigationItem>
                     <connections>
-                        <outlet property="detailText" destination="dcM-3R-DB6" id="xjt-Km-MjC"/>
+                        <outlet property="detailText" destination="Xrk-0H-B8o" id="hTl-cP-FEX"/>
                     </connections>
                 </viewController>
             </objects>
-            <point key="canvasLocation" x="902" y="64"/>
+            <point key="canvasLocation" x="1350" y="64"/>
+        </scene>
+        <!--Navigation Controller-->
+        <scene sceneID="a6N-vh-sA4">
+            <objects>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="aKO-h7-hUd" userLabel="First Responder" sceneMemberID="firstResponder"/>
+                <navigationController id="7bR-lH-lJ9" sceneMemberID="viewController">
+                    <toolbarItems/>
+                    <navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="cJU-5A-2mE">
+                        <rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                    </navigationBar>
+                    <nil name="viewControllers"/>
+                    <connections>
+                        <segue destination="Rsp-rs-tJf" kind="relationship" relationship="rootViewController" id="1U0-Gk-BfO"/>
+                    </connections>
+                </navigationController>
+            </objects>
+            <point key="canvasLocation" x="891" y="64"/>
         </scene>
     </scenes>
     <classes>
-        <class className="DetailViewController" superclassName="UIViewController">
-            <source key="sourceIdentifier" type="project" relativePath="./Classes/DetailViewController.h"/>
+        <class className="EditViewController" superclassName="UIViewController">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/EditViewController.h"/>
             <relationships>
+                <relationship kind="action" name="cancel:"/>
+                <relationship kind="action" name="done:"/>
                 <relationship kind="outlet" name="detailText" candidateClass="UITextView"/>
             </relationships>
         </class>
         <simulatedScreenMetrics key="destination"/>
     </simulatedMetricsContainer>
     <inferredMetricsTieBreakers>
-        <segue reference="0ct-gM-2FR"/>
+        <segue reference="aht-5S-Kxw"/>
     </inferredMetricsTieBreakers>
 </document>
\ No newline at end of file