在我开始之前,我是初学者,所以请不要压倒我。 (即使 - 虽然我可能对你抱歉):/
所以基本上我有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
答案 0 :(得分:0)
实际上,我把它想象出来,你所要做的就是在AppController中创建一个类方法,它将使用过的对象(self)存储为类变量。然后,您可以从任何地方访问该对象。它可能不是最有效的方式,我不知道因为我只是一个初学者,但它对我有用! :d
以下是相关代码:
-(void)awakeFromNib
{
[self setViewController:kStartScreenView];
viewObject = self;
}
+(id)getViewObject
{
return viewObject;
}
viewObject被定义为id类型的类变量。