如何从其他类访问NSView

时间:2013-12-26 22:03:36

标签: objective-c macos class nsview nsviewcontroller

在我开始之前,我是初学者,所以请不要压倒我。 (即使 - 虽然我可能对你抱歉):/

所以基本上我有1个主视图(NSView),我正在加载其他视图。所以我的awakeFromNib方法工作,它加载我的开始菜单视图(主菜单到一个tic tac toe游戏)。在菜单上是一个单人游戏和一个双人游戏按钮,根据我点击的按钮,我希望该程序加载更多的视图。

所以我有一个AppController类,它控制通过setViewController方法加载哪些视图。问题是我还没有找到一种方法将按钮从开始菜单视图连接到AppController类。所以我想如果在开始菜单类中我创建了一个AppController类型的对象,然后在按下单个或双重播放器按钮时调用setViewController方法,它会相应地改变视图,但事实证明它什么也没做。但是,当我调用AppController类中的setViewController方法时,它确实有效。所以我认为问题必须是从类外部访问视图的某个地方,但我可能错了。任何帮助将不胜感激,我花了很多时间试图解决这个问题,我没有任何运气与我尝试过。这是我的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

StartScreenViewController.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

1 个答案:

答案 0 :(得分:0)

实际上,我把它想象出来,你所要做的就是在AppController中创建一个类方法,它将使用过的对象(self)存储为类变量。然后,您可以从任何地方访问该对象。它可能不是最有效的方式,我不知道因为我只是一个初学者,但它对我有用! :d

以下是相关代码:

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

+(id)getViewObject
{
    return viewObject;
}

viewObject被定义为id类型的类变量。