我正在尝试使用新视图切换当前加载的视图。
我有3个xib文件和3组ViewControllerFiles。
RootViewController正确加载,并正确加载HomeViewController。
当前错误的行是
[self.rootViewController.view insertSubview:gameController.view atIndex:1];
**error: request for member 'view' in something not a structure or a union**
如果有人能指出我正确的方向那将是伟大的。我理解如何从根控制器切换视图,但我想从子视图交换/添加视图。如果这有意义吗?
这是根控制器头和实现:
#import <UIKit/UIKit.h>
@class HomeViewController;
@class GameViewController;
@interface RootViewController : UIViewController {
HomeViewController *homeViewController;
GameViewController *gameViewController;
}
@property (retain, nonatomic) HomeViewController *homeViewController;
@property (retain, nonatomic) GameViewController *gameViewController;
- (IBAction)showHome:(id)sender;
- (IBAction)showGame:(id)sender;
@end
实施档案:
#import "RootViewController.h"
#import "HomeViewController.h"
#import "GameViewController.h"
@implementation RootViewController
@synthesize homeViewController;
@synthesize gameViewController;
- (void)viewDidLoad {
homeViewController.rootViewController = self;
HomeViewController *homeController = [[HomeViewController alloc] initWithNibName:@"HomeView" bundle:nil];
self.homeViewController = homeController;
[self.view insertSubview:homeController.view atIndex:0];
[homeController release];
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
if (self.homeViewController.view.superview == nil) {
self.homeViewController = nil;
} else {
self.gameViewController = nil;
}
- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[homeViewController release];
[gameViewController release];
[super dealloc];
}
@end
以下是正确加载的主视图文件:
#import <UIKit/UIKit.h>
@class RootViewController;
@interface HomeViewController : UIViewController {
//GameViewController *gameViewController;
RootViewController *rootViewController;
}
//@property (retain, nonatomic) GameViewController *gameViewController;
@property (nonatomic, assign) RootViewController *rootViewController;
- (IBAction)showGame:(id)sender;
@end
实施档案:
#import "HomeViewController.h"
#import "RootViewController.h"
@implementation HomeViewController;
@synthesize rootViewController;
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
}
- (IBAction)showGame:(id)sender{
GameViewController *gameController = [[GameViewController alloc] initWithNibName:@"GameView" bundle:nil];
self.rootViewController = gameController;
[self.rootViewController.view insertSubview:gameController.view atIndex:1];
[gameController release];
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[super dealloc];
}
@end
答案 0 :(得分:1)
我对你的评论感到困惑。以下是其他代码段:
- (IBAction)showGame:(id)sender {
GameViewController *gameController = [[GameViewController alloc] initWithNibName:@"GameView" bundle:nil];
self.rootViewController = gameController;
[self.rootViewController.view insertSubview:gameController.view atIndex:1];
[gameController release];
}
所以你要将HomeViewController的rootViewController设置为等于gameController。然后你将gameController视图插入到rootViewController的视图中。但是,gameController是rootViewController。我认为你在这里有一个逻辑错误。
答案 1 :(得分:1)
幸运的是这很容易解决 - 你忘了包含GameViewController头文件。因此,它不知道GameViewController实例的view属性是什么。
答案 2 :(得分:0)
我认为这是你的问题:
- (void)viewDidLoad {
homeViewController.rootViewController = self;
HomeViewController *homeController = [[HomeViewController alloc] initWithNibName:@"HomeView" bundle:nil];
self.homeViewController = homeController;
在初始化rootViewController
之前,您已将homeViewController
分配给homeViewController
。那时`self.homeViewController'只是空的内存。