2012-10-09 78 views
1

我正在使用Xcode 4.3.2。以编程方式加载笔尖

我想以编程方式加载一个Nib而不是使用Storyboards。故事板看起来简单很多,但不幸的是,它们与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的“Custom Class”是Identity Inspector中的“GreenViewController”。另外,我确定“查看”的引用出口是文件的所有者。我想在我的应用程序启动时加载GreenView笔尖。最后,我会通过添加一个按钮来切换视图,但到目前为止,我还没有能够加载主视图。我不确定我的误解。

非常感谢您的帮助!

+0

你有正确合成你的'switchViewController'财产? –

+0

Adil,那绝对是我的问题。我添加了“@synthesize switchViewController;” &现在我的错误是:2012-10-09 13:48:27.970 MyViewSwitcher [5345:f803]应用程序窗口预计在应用程序启动结束时有一个根视图控制器 – Henry

+0

您可以给我这个手吗?我想我正走上正轨。 – Henry

回答

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; 
+0

清洁和构建也有帮助。谢谢罗布。 – Henry

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

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

+0

我如何调用方法setSwitchViewController?我没有定义它。我是否在某个地方默默地称呼它? – Henry

0
  1. 请确保您的UIWindowrootViewController,使用makeKeyAndVisible

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

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

  3. 在子类中实现方法时,如SwitchViewController.m,何时调用super方法很重要。除非您有特别的意图,否则几乎总是致电super执行先于本地self执行。所以,我建议你改变- (void)viewDidLoadSwitchViewController.m要像下面

    • (无效)viewDidLoad中{ [超级viewDidLoad中]

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

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