以编程方式加载Nib

时间:2012-10-09 19:45:15

标签: objective-c ios xcode ios5 nib

我正在使用Xcode 4.3.2。

我正在尝试以编程方式加载Nib而不是使用Storyboard。故事板似乎更简单,但不幸的是它们与iOS 4&我正在构建一个需要向后兼容的应用程序。

这是我的问题:我正在尝试加载主视图 - 带有绿色背景的简单视图。目前没有默认视图。

我的档案是:

AppDelegate.h / .M GreenViewController.h / .M SwitchViewController.h / .M

我想在应用程序开始时加载绿屏,所以在AppDelegate.m中我有:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.switchViewController = [[SwitchViewController alloc] initWithNibName:@"GreenView" bundle:nil];

    //UIView *switchView = self.switchViewController.view;


    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

在SwitchViewController.m中我有:

- (void)viewDidLoad
{
    self.greenViewController = [[GreenViewController alloc] initWithNibName:@"GreenView" bundle:nil];
    [self.view insertSubview:self.greenViewController.view atIndex:0];
    [super viewDidLoad];
}

使用默认代码填充简单的initWithNibName。

在GreenViewController.m中我有:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

这是一切的主要功能。当我运行应用程序时,我立即收到错误:

2012-10-09 12:34:35.586 MyViewSwitcher[5210:f803] -[AppDelegate setSwitchViewController:]: unrecognized selector sent to instance 0x6c6c310
2012-10-09 12:34:35.587 MyViewSwitcher[5210:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AppDelegate setSwitchViewController:]: unrecognized selector sent to instance 0x6c6c310'

有人可以帮我理解我的错误原因吗?我确保GreenView.xib的“自定义类”是Identity Inspector中的“GreenViewController”。此外,我确保“View”的引用插座是文件的所有者。我想在我的应用程序启动时加载GreenView笔尖。最后,我将通过添加按钮来切换视图,但到目前为止,我甚至无法加载主视图。我不确定我误解了什么。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

问题不在于加载笔尖。问题出在这一行:

self.switchViewController = [[SwitchViewController alloc] initWithNibName:@"GreenView" bundle:nil];

这里使用的是“点语法”,The Objective-C Programming Language中对此进行了解释。使用该语法设置属性时,编译器会将其转换为常规的Objective-C消息,如下所示:

[self setSwitchViewController:[[SwitchViewController alloc] initWithNibName:@"GreenView" bundle:nil]];

在运行时,系统会告诉您AppDelegate对象不理解setSwitchViewController:方法。您需要使用@synthesize指令(在The Objective-C Programming Language中解释)来告诉编译器为您实现setSwitchViewController:方法:

@synthesize switchViewController = _switchViewController;

答案 1 :(得分:0)

 '-[AppDelegate setSwitchViewController:]: unrecognized selector sent to instance 0x6c6c310'

您正在向AppDelegate中的/发送消息(调用方法)setSwitchViewController:。这就是问题所在。

答案 2 :(得分:0)

  1. 在使用UIWindow之前,请确保rootViewControllermakeKeyAndVisible

    [self.window setRootViewController:self.switchViewController]; [self.window makeKeyAndVisible];

  2. 确保按照上述说明合成属性。

  3. 在子类中实现方法时,与SwitchViewController.m一样,何时调用super方法很重要。除非您有任何特殊意图,否则几乎总是在本地super实施之前调用self实现。因此,我建议您将- (void)viewDidLoad中的SwitchViewController.m更改为跟随

    • (void)viewDidLoad { [super viewDidLoad];

      self.greenViewController = [[GreenViewController alloc] initWithNibName:@“GreenView”bundle:nil];

      [self.view insertSubview:self.greenViewController.view atIndex:0]; }