2012-10-09 116 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]; }