Как получить доступ к NSViews из других классов

Прежде чем я начну, я новичок, поэтому, пожалуйста, не перегружайте меня. (хоть я наверное и сделал с тобой извините) :/

Итак, в основном у меня есть 1 основное представление (NSView), на которое я загружаю другие представления. Итак, мой метод awakeFromNib работает, и он загружает мое меню «Пуск» (главное меню для игры в крестики-нолики). В меню есть кнопка одиночного проигрывателя и двойного проигрывателя, и в зависимости от того, какую кнопку я нажимаю, я хотел бы, чтобы программа загружала дальнейшие виды.

Итак, у меня есть класс AppController, который контролирует, какие представления загружаются с помощью метода setViewController. Проблема в том, что я не нашел способа подключить кнопки из моего меню «Пуск» к классу AppController. Поэтому я подумал, что если внутри класса меню «Пуск» я создам объект типа AppController, а затем вызову метод setViewController при нажатии кнопки одиночного или двойного плеера, он соответствующим образом изменит представления, но оказалось, что он ничего не делает. Однако когда я вызываю метод setViewController внутри класса AppController, он работает. Поэтому я думаю, что проблема должна быть где-то с доступом к представлению из-за пределов его класса, но я могу ошибаться. Любая помощь будет принята с благодарностью, я потратил много времени, пытаясь понять это, и мне не повезло ни с чем, что я пробовал. Вот мой класс AppController и мой класс начального экрана.


AppController.h:

@interface AppController : NSObject

@property (weak) IBOutlet NSView *mainMenu;
@property (strong) NSViewController *mainViewController;

-(void)setViewController:(NSInteger)viewNumber;

@end

AppController.m:

@implementation AppController

@synthesize mainMenu = _mainMenu;
@synthesize mainViewController =_mainViewController;

NSString *const kStartScreen = @"StartScreenViewController";
NSString *const kOnePlayerMenu = @"OnePlayerMenuViewController";
NSString *const kTwoPlayerMenu = @"TwoPlayerMenuViewController";
int test = 0;

enum{
    kStartScreenView = 0,
    kOnePlayerView,
    kTwoPlayerView
};


-(void)awakeFromNib
{
    [self setViewController:0];
}


-(void)setViewController:(NSInteger)viewNumber
{
    [[_mainViewController view] removeFromSuperview];

    if(viewNumber==kStartScreenView)
    {
        self.mainViewController = [[StartScreenViewController alloc] initWithNibName:
                                    kStartScreen bundle:nil];

    }
    else if(viewNumber==kOnePlayerView)
    {
        self.mainViewController = [[OnePlayerMenuViewController alloc] initWithNibName:
                                    kOnePlayerMenu bundle:nil];
    }
    else if(viewNumber==kTwoPlayerView)
    {
        self.mainViewController = [[TwoPlayerMenuViewController alloc] initWithNibName:
                                   kTwoPlayerMenu bundle:nil];
    }

    [_mainMenu addSubview:[_mainViewController view]];
    [[_mainViewController view] setFrame:[_mainMenu bounds]];
}
@end

Стартскринвиевконтроллер.h:

@interface StartScreenViewController : NSViewController

- (IBAction)OnePlayer:(id)sender;
- (IBAction)TwoPlayer:(id)sender;

@end

StartScreenViewController.m:

@interface StartScreenViewController ()

@end

@implementation StartScreenViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self)
    {

    }
    return self;
}

- (IBAction)OnePlayer:(id)sender
{
    AppController *appControllerObj = [[AppController alloc] init];
    [appControllerObj setViewController:1];
}

- (IBAction)TwoPlayer:(id)sender
{
    AppController *appControllerObj = [[AppController alloc] init];
    [appControllerObj setViewController:2];
}


@end

person jundl77    schedule 26.12.2013    source источник
comment
Почему вы выделяете более одного AppController? Похоже, что в приложении должен быть только один AppController. ;)   -  person Ken Aspeslagh    schedule 27.12.2013
comment
да, не знаю, но я решил это, все еще ища кнопку ответа на вопрос, хотя .. ха-ха, только что присоединился к этому сайту, но спасибо :) и разве у меня нет только 1 контроллера приложений?   -  person jundl77    schedule 27.12.2013
comment
Один будет создан пером, если он у вас есть, а затем вы создаете новый каждый раз, когда вызываете alloc в StartScreenViewController.   -  person Ken Aspeslagh    schedule 27.12.2013
comment
а ок не знал, спасибо!   -  person jundl77    schedule 27.12.2013


Ответы (1)


На самом деле, я понял это, все, что вам нужно сделать, это создать метод класса в AppController, который хранит используемый объект (я) в качестве переменной класса. Затем вы можете получить доступ к этому объекту из любого места. Это может быть не самый эффективный способ сделать это, я понятия не имею, поскольку я только начинающий, но это сработало для меня! :D

Вот соответствующий код:

-(void)awakeFromNib
{
   [self setViewController:kStartScreenView];
   viewObject = self;
}

+(id)getViewObject
{
    return viewObject;
}

viewObject определяется как переменная класса с идентификатором типа.

person jundl77    schedule 27.12.2013