From 2550c4866e7b53f1a1500f47daa908ee1044ea4c Mon Sep 17 00:00:00 2001 From: Evadne Wu Date: Tue, 16 Nov 2010 11:24:12 +0800 Subject: [PATCH 1/6] Ignores various OS X noise --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 3315f56..2537115 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ *.pbxuser *.perspectivev3 build +*.mode1v3 +.DS_Store From 7b95f05400ffebaaea6ff6e54abb1d1d3b76bdfc Mon Sep 17 00:00:00 2001 From: Evadne Wu Date: Tue, 16 Nov 2010 21:43:39 +0800 Subject: [PATCH 2/6] fixes a null initial value bug --- Classes/MGSplitViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/MGSplitViewController.m b/Classes/MGSplitViewController.m index 61b30a6..ed06b7e 100644 --- a/Classes/MGSplitViewController.m +++ b/Classes/MGSplitViewController.m @@ -1068,7 +1068,7 @@ - (void)setDividerStyle:(MGSplitViewDividerStyle)newStyle _dividerStyle = newStyle; // Reconfigure general appearance and behaviour. - float cornerRadius; + float cornerRadius = 0.0f; if (_dividerStyle == MGSplitViewDividerStyleThin) { cornerRadius = MG_DEFAULT_CORNER_RADIUS; _splitWidth = MG_DEFAULT_SPLIT_WIDTH; From 4fe4a6a630a7df61e4b53ad400113a34dea3c4cb Mon Sep 17 00:00:00 2001 From: Evadne Wu Date: Tue, 7 Dec 2010 04:41:05 +0800 Subject: [PATCH 3/6] Assigns default values to leadingCorners, trailingCorners so Clang is happy --- Classes/MGSplitViewController.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Classes/MGSplitViewController.m b/Classes/MGSplitViewController.m index ed06b7e..8f065ec 100644 --- a/Classes/MGSplitViewController.m +++ b/Classes/MGSplitViewController.m @@ -419,8 +419,8 @@ - (void)layoutSubviewsForInterfaceOrientation:(UIInterfaceOrientation)theOrienta } // Create corner views if necessary. - MGSplitCornersView *leadingCorners; // top/left of screen in vertical/horizontal split. - MGSplitCornersView *trailingCorners; // bottom/right of screen in vertical/horizontal split. + MGSplitCornersView *leadingCorners = nil; // top/left of screen in vertical/horizontal split. + MGSplitCornersView *trailingCorners = nil; // bottom/right of screen in vertical/horizontal split. if (!_cornerViews) { CGRect cornerRect = CGRectMake(0, 0, 10, 10); // arbitrary, will be resized below. leadingCorners = [[MGSplitCornersView alloc] initWithFrame:cornerRect]; From 911950f68f1b957af7ccb6c50d1b86df598d68ca Mon Sep 17 00:00:00 2001 From: Evadne Wu Date: Sun, 9 Jan 2011 15:54:52 +0800 Subject: [PATCH 4/6] Allows toggling the popover from the bar button. in MGSplitViewController adds property (BOOL) togglesMasterPopover. adds internal -toggleMasterPopover:, -hideMasterPopover:. in MGSplitViewControllerDelegate adds -splitViewController:popoverController:willDismissViewController: --- Classes/MGSplitViewController.h | 8 ++++++ Classes/MGSplitViewController.m | 51 ++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/Classes/MGSplitViewController.h b/Classes/MGSplitViewController.h index d902dc3..8df7c60 100644 --- a/Classes/MGSplitViewController.h +++ b/Classes/MGSplitViewController.h @@ -50,11 +50,14 @@ typedef enum _MGSplitViewDividerStyle { @property (nonatomic, readonly, getter=isLandscape) BOOL landscape; // returns YES if this view controller is in either of the two Landscape orientations, else NO. +@property (nonatomic, readwrite) BOOL togglesMasterPopover; // default is NO. + // Actions - (IBAction)toggleSplitOrientation:(id)sender; // toggles split axis between vertical (left/right; default) and horizontal (top/bottom). - (IBAction)toggleMasterBeforeDetail:(id)sender; // toggles position of master view relative to detail view. - (IBAction)toggleMasterView:(id)sender; // toggles display of the master view in the current orientation. - (IBAction)showMasterPopover:(id)sender; // shows the master view in a popover spawned from the provided barButtonItem, if it's currently hidden. +- (IBAction)hideMasterPopover:(id)sender; // hides the master view in a popover spawned from the provided barButtonItem, if it's currently shown. - (void)notePopoverDismissed; // should rarely be needed, because you should not change the popover's delegate. If you must, then call this when it's dismissed. // Conveniences for you, because I care. @@ -103,6 +106,11 @@ typedef enum _MGSplitViewDividerStyle { popoverController:(UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController; +// Called when a popover containing the master view is going to be hidden so the delegate can take action like showing other popovers. This only happens if togglesMasterPopover is set to YES. +- (void)splitViewController:(MGSplitViewController*)svc + popoverController:(UIPopoverController*)pc + willDismissViewController:(UIViewController *)aViewController; + // Called when the split orientation will change (from vertical to horizontal, or vice versa). - (void)splitViewController:(MGSplitViewController*)svc willChangeSplitOrientationToVertical:(BOOL)isVertical; diff --git a/Classes/MGSplitViewController.m b/Classes/MGSplitViewController.m index 8f065ec..244236a 100644 --- a/Classes/MGSplitViewController.m +++ b/Classes/MGSplitViewController.m @@ -564,7 +564,7 @@ - (void)reconfigureForMasterInPopover:(BOOL)inPopover _barButtonItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Master", nil) style:UIBarButtonItemStyleBordered target:self - action:@selector(showMasterPopover:)]; + action:(self.togglesMasterPopover ? @selector(toggleMasterPopover:) : @selector(showMasterPopover:))]; // Inform delegate of this state of affairs. if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willHideViewController:withBarButtonItem:forPopoverController:)]) { @@ -702,6 +702,36 @@ - (IBAction)toggleMasterView:(id)sender } +- (void) setTogglesMasterPopover:(BOOL)flag { + + togglesMasterPopover = flag; + + if (!_barButtonItem) + return; + + _barButtonItem.action = flag ? @selector(toggleMasterPopover:) : @selector(showMasterPopover:); + +} + +- (IBAction)toggleMasterPopover:(id)sender +{ + + if (!_hiddenPopoverController) + return; + + if (_hiddenPopoverController.popoverVisible) { + + [self hideMasterPopover:sender]; + + } else { + + [self showMasterPopover:sender]; + + } + +} + + - (IBAction)showMasterPopover:(id)sender { if (_hiddenPopoverController && !(_hiddenPopoverController.popoverVisible)) { @@ -718,6 +748,24 @@ - (IBAction)showMasterPopover:(id)sender } +- (IBAction)hideMasterPopover:(id)sender +{ + + if(_hiddenPopoverController && _hiddenPopoverController.popoverVisible) { + + if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:popoverController:willDismissViewController:)]) { + + [(NSObject *)_delegate splitViewController:self popoverController:_hiddenPopoverController willDismissViewController:self.masterViewController]; + + } + + [_hiddenPopoverController dismissPopoverAnimated:YES]; + + } + +} + + #pragma mark - #pragma mark Accessors and properties @@ -1129,5 +1177,6 @@ - (NSArray *)cornerViews @synthesize allowsDraggingDivider; @synthesize dividerStyle; +@synthesize togglesMasterPopover; @end From 867c9cc174bb981f1909e382169e7d75b1e47892 Mon Sep 17 00:00:00 2001 From: Evadne Wu Date: Tue, 25 Jan 2011 01:34:07 +0800 Subject: [PATCH 5/6] revises several no-initial-value-for-synthesized-property issues as reported by Clang, fixes leaks --- Classes/MGSplitViewController.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Classes/MGSplitViewController.m b/Classes/MGSplitViewController.m index 244236a..8f107f9 100644 --- a/Classes/MGSplitViewController.m +++ b/Classes/MGSplitViewController.m @@ -148,6 +148,8 @@ - (void)setup - (void)dealloc { _delegate = nil; + [masterViewController release]; + [detailViewController release]; [self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; [_viewControllers release]; [_barButtonItem release]; @@ -1168,10 +1170,10 @@ - (NSArray *)cornerViews @synthesize showsMasterInLandscape; @synthesize vertical; @synthesize delegate; -@synthesize viewControllers; +@synthesize viewControllers = _viewControllers; @synthesize masterViewController; @synthesize detailViewController; -@synthesize dividerView; +@synthesize dividerView = _dividerView; @synthesize splitPosition; @synthesize splitWidth; @synthesize allowsDraggingDivider; From 316aad915169d93becd5f7b6b3976e219c1b7d73 Mon Sep 17 00:00:00 2001 From: Evadne Wu Date: Tue, 1 Feb 2011 23:54:23 +0800 Subject: [PATCH 6/6] non-synthesized-by-default bugfix --- Classes/MGSplitViewController.h | 1 + Classes/MGSplitViewController.m | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Classes/MGSplitViewController.h b/Classes/MGSplitViewController.h index 8df7c60..e8026a9 100644 --- a/Classes/MGSplitViewController.h +++ b/Classes/MGSplitViewController.h @@ -31,6 +31,7 @@ typedef enum _MGSplitViewDividerStyle { float _splitPosition; BOOL _reconfigurePopup; MGSplitViewDividerStyle _dividerStyle; // Meta-setting which configures several aspects of appearance and behaviour. + BOOL togglesMasterPopover; } @property (nonatomic, assign) IBOutlet id delegate; diff --git a/Classes/MGSplitViewController.m b/Classes/MGSplitViewController.m index 8f107f9..98e6cec 100644 --- a/Classes/MGSplitViewController.m +++ b/Classes/MGSplitViewController.m @@ -148,8 +148,8 @@ - (void)setup - (void)dealloc { _delegate = nil; - [masterViewController release]; - [detailViewController release]; + [self.masterViewController release]; + [self.detailViewController release]; [self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; [_viewControllers release]; [_barButtonItem release];