Для Iphone, как ссылаться на контроллер корневого представления из загруженного в данный момент представления, поэтому представление можно заменить / переключить - PullRequest
0 голосов
/ 29 октября 2009

Я пытаюсь переключить текущее загруженное представление на новое.

У меня есть 3 xib-файла и 3 набора файлов ViewController.

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

Ответы [ 3 ]

1 голос
/ 30 октября 2009

К счастью, это легко исправить - вы забыли включить заголовочный файл GameViewController. Следовательно, он не знает, каково свойство view вашего экземпляра GameViewController.

1 голос
/ 29 октября 2009

Я смущен вашим комментарием. Вот дополнительный фрагмент кода:

- (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]; 
}

Итак, вы устанавливаете rootViewController для HomeViewController равным gameController. Затем вы вставляете представление gameController в представление rootViewController. Но gameController - это rootViewController. Я думаю, у вас здесь логическая ошибка.

0 голосов
/ 30 октября 2009

Я думаю, что это ваша проблема:

- (void)viewDidLoad {

homeViewController.rootViewController = self;

HomeViewController *homeController = [[HomeViewController alloc]  initWithNibName:@"HomeView" bundle:nil];
self.homeViewController = homeController; 

Вы присваиваете rootViewController homeViewController до инициализации homeViewController. В этот момент self.homeViewController - это просто пустая память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...