diff --git a/.gitignore b/.gitignore index 3315f56..2537115 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ *.pbxuser *.perspectivev3 build +*.mode1v3 +.DS_Store diff --git a/Classes/MGSplitViewController.h b/Classes/MGSplitViewController.h index d902dc3..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; @@ -50,11 +51,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 +107,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 61b30a6..98e6cec 100644 --- a/Classes/MGSplitViewController.m +++ b/Classes/MGSplitViewController.m @@ -148,6 +148,8 @@ - (void)setup - (void)dealloc { _delegate = nil; + [self.masterViewController release]; + [self.detailViewController release]; [self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; [_viewControllers release]; [_barButtonItem release]; @@ -419,8 +421,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]; @@ -564,7 +566,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 +704,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 +750,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 @@ -1068,7 +1118,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; @@ -1120,14 +1170,15 @@ - (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; @synthesize dividerStyle; +@synthesize togglesMasterPopover; @end