1 #import "DetailViewController.h"
2 #import "MasterViewController.h"
4 @interface DetailViewController () {
7 @property (strong, nonatomic) UIPopoverController *masterPopoverController;
11 @implementation DetailViewController
13 @synthesize detailItem = _detailItem;
15 @synthesize detailText = _detailText;
16 @synthesize masterPopoverController = _masterPopoverController;
18 #pragma mark - Managing the detail item
20 - (void)setDetailItem:(id)newDetailItem
22 if (_detailItem != newDetailItem) {
23 _detailItem = newDetailItem;
29 if (self.masterPopoverController != nil) {
30 [self.masterPopoverController dismissPopoverAnimated:YES];
37 if (self.detailItem && self.detailItem.path) {
39 noteData = [NSString stringWithContentsOfFile:self.detailItem.path
40 encoding:NSUTF8StringEncoding
46 self.detailText.text = noteData;
52 // Do any additional setup after loading the view, typically from a nib.
53 NSNotificationCenter *notify = [NSNotificationCenter defaultCenter];
54 [notify addObserver:self
55 selector:@selector(keyboardDidShow:)
56 name:UIKeyboardDidShowNotification
59 [notify addObserver:self
60 selector:@selector(keyboardDidHide:)
61 name:UIKeyboardDidHideNotification
64 self.detailText.delegate = self;
71 [self setDetailText:nil];
72 self.detailItem = nil;
74 [super viewDidUnload];
77 - (void)viewWillDisappear:(BOOL)animated {
78 // Leaving detail view
80 NSString *note = self.detailText.text;
81 FileItem *newPath = [storage save:note item: self.detailItem];
83 // To notify master view, retract reference from navigation controller.
84 MasterViewController *master = [self.navigationController.viewControllers objectAtIndex:0];
86 if (self.detailItem.name) {
88 if (self.detailItem != newPath) {
89 [master itemChanged: self.detailItem to:newPath];
93 [master itemAdded: newPath];
97 [super viewWillDisappear: animated];
100 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
102 if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
103 return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
109 - (void)textViewDidChange:(UITextView *)textView {
113 #pragma mark - Notification handler
115 - (void)keyboardDidShow:(NSNotification*)notification {
116 NSDictionary *info = [notification userInfo];
118 CGRect beginRect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] fromView:nil];
119 CGRect rect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
120 CGRect frame = self.detailText.frame;
122 if (beginRect.size.height == rect.size.height) {
124 frame.size.height -= rect.size.height;
127 frame.size.height -= (rect.size.height - beginRect.size.height);
129 self.detailText.frame = frame;
133 - (void)keyboardDidHide:(NSNotification*)notification {
135 NSDictionary *info = [notification userInfo];
137 CGRect rect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
138 CGRect frame = self.detailText.frame;
140 frame.size.height += rect.size.height;
141 self.detailText.frame = frame;
144 #pragma mark - Split view
146 - (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
148 barButtonItem.title = NSLocalizedString(@"Master", @"Master");
149 [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
150 self.masterPopoverController = popoverController;
153 - (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
155 // Called when the view is shown again in the split view, invalidating the button and popover controller.
156 [self.navigationItem setLeftBarButtonItem:nil animated:YES];
157 self.masterPopoverController = nil;