2

我正在启动一个具有两个视图的多视图应用程序:NewGame 和 Players。我以为我正在正确设置所有内容,但显然不是。

主视图控制器.h

#import <UIKit/UIKit.h>

@class NewGame; @class Players;

@interface MainViewController : UIViewController {
    IBOutlet NewGame *newGameController;
    IBOutlet Players *playersController;
}

-(IBAction) loadNewGame:(id)sender;
-(IBAction) loadPlayers:(id)sender;

-(void) clearView;

@end

主视图控制器.m

#import "MainViewController.h"
#import "NewGame.h"
#import "Players.h"

@implementation MainViewController

-(IBAction) loadNewGame:(id)sender {
    [self clearView];
    [self.view insertSubview:newGameController atIndex:0];
}

-(IBAction) loadPlayers:(id)sender {
    [self clearView];
    [self.view insertSubview:playersController atIndex:0];
}

-(void) clearView {
    if (newGameController.view.superview) {
        [newGameController.view removeFromSuperview];
    } else if (playersController.view.superview) {
        [playersController.view removeFromSuperview];
    }
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [self loadNewGame:nil];
    [super viewDidLoad];
}

几张图...

http://i.stack.imgur.com/GwXMa.png http://i.stack.imgur.com/XHktH.png

4

3 回答 3

1

视图是表示屏幕上显示内容的对象。 视图控制器是执行与这些视图相关的应用程序逻辑的对象。视图层次结构是视图的集合。您正在尝试将视图控制器添加到视图层次结构中,就好像它实际上是一个视图一样。

粗略地说,您应该为应用程序的每个“屏幕”配备一个视图控制器。这个视图控制器可以管理任意数量的视图。它的主要视图可通过其view属性访问。

让您的应用程序运行的快速解决方法是添加视图控制器的主视图,而不是视图控制器本身。因此,例如,这个:

[self.view insertSubview:playersController atIndex:0];

...会变成这样:

[self.view insertSubview:playersController.view atIndex:0];

话虽如此,从长远来看,这不是一个好的解决方案,您应该研究一种更结构化的方式来组织从视图控制器到视图控制器的转换。 UINavigationController是初学者的好选择。

于 2011-03-06T02:31:32.863 回答
0

我想 playerController 是视图控制器。然后加

[self.view addSubview: playerController.view];

或者,如果不是,则将它们子类化为 UIView

于 2011-03-06T02:27:36.887 回答
0

NewGame 和 Players 都需要继承 UIView。如果它们是 ViewController,而不是 UIView,则需要使用 newGameController.view 而不是 newGameController。

于 2011-03-06T02:30:40.313 回答