Edit: While the answer below does work, it is definitely not the best way. In your storyboard, select the view controller for the destination view then go to the attributes inspector and change Presentation from Multiple to Single. That's it, no code required.
Not sure this is the best way but in the NSViewController
that is pushing the segue, you could add a property for the destination NSViewController
and, in your prepareForSegue:sender:
method, assign the destination view controller. Finally, in the shouldPerformSegueWithIdentifier:sender:
method, check to see if the destination view controller is assigned, and, if so, bring its window to the front and return NO
meaning don't perform the segue, otherwise, return YES
. Here's a quick example (to be included in the NSViewController
with the button to initiate the segue):
@interface ViewController ()
@property (weak) NSViewController *pushedViewController;
@end
@implementation ViewController
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
if (self.pushedViewController) {
[self.pushedViewController.view.window makeKeyAndOrderFront:self];
return NO;
}
return YES;
}
- (void)prepareForSegue:(NSStoryboardSegue *)segue sender:(id)sender {
self.pushedViewController = segue.destinationController;
}
@end
When you close the window containing the destination view controller, this will set the pushedViewController property of the original view controller to nil so the segue will perform if the window is not already opened. Again, there may be a better way to do this. Hope this helps.
Jon
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…