Навигация между NSVIewController

Аз съм много нов в разработката на приложения за MAC OSX. В моето приложение имам три NSViewControllers, които са PracticeController, NoteController и QuestionController. Трябва да навигирам до NoteViewController от PracticeController и QuestionController и да се върна към viewController, от който NoteController е навигирал.

Например: когато навигираме до NoteController от PracticeController, тогава, когато докоснем бутона за връщане назад от NoteController, трябва да отида до PracticeController, а когато навигираме до NoteController от QuestionController, тогава, когато докоснем бутона за връщане от NoteController, трябва да отида до QuestionController.

Моля, помогнете ми как да направя това? Лошо го търся. Благодаря.


person Juno    schedule 04.09.2013    source източник


Отговори (1)


добре, след дълго търсене намерих библиотека с отворен код, която пренася UIKit към MacOSX.
https://github.com/BigZaphod/Chameleon.git
Но това е твърде сложно за мен, така че написах свой собствен навигационен контролер.

NSNavigationController.h

#import <Cocoa/Cocoa.h>

@class BaseViewController;
@interface NSNavigationController : NSResponder
@property (nonatomic, strong) BaseViewController *rootViewController;

- (id)initWithRootViewController:(BaseViewController *)rootViewController;
- (NSView*)view;

- (void)pushViewController:(BaseViewController *)viewController animated:(BOOL)animated;
- (BaseViewController *)popViewControllerAnimated:(BOOL)animated;
@end

NSNavigationController.m

#import "NSNavigationController.h"
#import "AppDelegate.h"
#import "BaseViewController.h"

@interface NSNavigationController ()
@property (nonatomic, strong) NSMutableArray *viewControllerStack;
@end

@implementation NSNavigationController
- (id)initWithRootViewController:(BaseViewController *)rootViewController
{
    self = [super init];
    if (self) {
        self.rootViewController = rootViewController;
        self.rootViewController.navigationController = self;
        self.viewControllerStack = [[NSMutableArray alloc] initWithObjects:self.rootViewController, nil];
    }
    return self;
}

- (NSView*)view
{
    BaseViewController *topViewController = [self.viewControllerStack objectAtIndex:[self.viewControllerStack count] - 1];
    return topViewController.view;
}

- (void)pushViewController:(BaseViewController *)viewController animated:(BOOL)animated
{
    if (viewController != nil) {
        [self removeTopView];
        [self.viewControllerStack addObject:viewController];
        viewController.navigationController = self;
        [self addTopView];
    }
}

- (BaseViewController *)popViewControllerAnimated:(BOOL)animated
{
    BaseViewController *topViewController = [self.viewControllerStack objectAtIndex:[self.viewControllerStack count] - 1];
    [self removeTopView];
    [self.viewControllerStack removeLastObject];
    [self addTopView];

    return topViewController;
}

- (void)removeTopView
{
    BaseViewController *topViewController = [self.viewControllerStack objectAtIndex:[self.viewControllerStack count] - 1];
    [topViewController.view removeFromSuperview];
}

- (void)addTopView
{
    BaseViewController *topViewController = [self.viewControllerStack objectAtIndex:[self.viewControllerStack count] - 1];
    AppDelegate *delegate = (AppDelegate*)[NSApp delegate];
    [delegate.window.contentView addSubview:topViewController.view];
}
@end

BaseViewController.h

#import <Cocoa/Cocoa.h>

@class NSNavigationController;

@interface BaseViewController : NSViewController
@property (nonatomic, weak) NSNavigationController *navigationController;
@end

BaseViewController.m

#import "BaseViewController.h"

@interface BaseViewController ()

@end

@implementation BaseViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Initialization code here.
    }
    return self;
}

@end

Това е най-простият навигационен контролер. Не внедрих анимацията за изглед. Надявам се, че може да помогне.

person kilik52    schedule 03.11.2013
comment
@kilik52 Благодаря за публикацията. Само няколко коментара – Обикновено не искате да наименувате клас, който правите с префикса NS. NS предполага, че е направен от Next Step, а този навигационен контролер не е. Освен това може да искате действително да импортирате NSNavigationController в BaseViewController, вместо просто да го декларирате напред, по този начин всеки екземпляр на подклас на BaseViewController може да има достъп до своето свойство navigationController. - person Kelly Bennett; 10.01.2014
comment
@RagnarDanneskjöld Благодаря ви за коментарите. Мисля, че си прав. - person kilik52; 10.01.2014
comment
Здравей, страхотна публикация!! Опитвам се да приложа това, но не успях. Прозорецът в AppDelegate го няма. Това може да е актуализация, направена от Apple. Как мога да внедря това с помощта на Storyboard? - person Henit Nathwani; 01.03.2016