2011-12-19 65 views
0

重寫RootViewController.xib在UISplitViewController安裝在iPad上,RootViewControllerUIViewController類與XIB文件(不是UITableViewController在UISplitViewController

我的App有幾個目標。根據所選的目標(並通過代碼中的#ifdef ...),我想爲RootViewController指定一個不同的XIB文件。

我想的變化具有application:didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Add the split view controller's view to the window and display. 
    self.window.rootViewController = self.splitViewController; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

== EDIT ==

我刪除從MainWindow.xib中所有控制器進行,然後加入在AppDelegate中以下行。 RootViewController與相應的XIB一起啓動,但SplitViewController中的RootVC和DetailsVC之間的機制不起作用;即。當擊中RootVC中的一個應該觸發DefaultVC變化的按鈕時,什麼都不會發生。我明顯錯過了一些東西。

splitViewController = [[UISplitViewController alloc] init]; 

#ifdef OPTION1 
    rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController_1" bundle:nil]; 
#elif OPTION2 
    rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController_2" bundle:nil]; 
#endif 

defaultViewController = [[[DefaultViewController alloc] init] autorelease]; 

UINavigationController *rootNav = [[[UINavigationController alloc] initWithRootViewController:rootViewController] autorelease]; 
UINavigationController *defaultNav = [[[UINavigationController alloc] initWithRootViewController:defaultViewController] autorelease]; 

splitViewController.viewControllers = [NSArray arrayWithObjects:rootNav, defaultNav, nil]; 
splitViewController.delegate = defaultViewController; 

self.window.rootViewController = self.splitViewController; 
[self.window makeKeyAndVisible]; 

// Add the split view controller's view to the window and display. 
self.window.rootViewController = self.splitViewController; 
[self.window makeKeyAndVisible]; 

回答

1

您的代碼示例似乎是一個很艱難和困惑的方式做一個拆分視圖控制器,所以我就滿足了更普遍的問題:

我的App有幾個目標。根據所選的目標(並通過代碼中的#ifdef ...),我想爲RootViewController指定一個不同的XIB文件。

如果您在項目中定義了多個目標,則不需要#ifdef即可完成此操作。使用構建過程的目標機制要簡單得多。

假設您有兩個資源,都稱爲「MyFunResource」,但您希望在名爲「blue」的目標中使用一個資源,而您希望在另一個名爲「red」的目標中使用另一個資源。

將這兩種資源添加到您的項目中。但在文件檢查器(「視圖」>「實用程序」>「顯示文件檢查器」)中,請注意「目標成員」部分。請注意,您的所有目標都在其旁邊的複選框中列出。在構建給定目標時,只有在此處選中了目標名稱時,纔會將所選資源複製到該束中。

因此,選擇您想要在「紅色」目標中使用的「MyFunResource」,並確保「紅色」是「目標成員資格」中唯一帶有複選標記的選項。然後選擇一個你想要的「藍色」,並確保只有「藍色」被選中。

現在,當您構建紅色目標時,構建系統將只將與紅色相關的資源複製到該包中,這樣神奇地,紅色資源就是在運行時使用的資源。反之亦然,藍色。沒有代碼或'#ifdef的必需。

+0

謝謝傑姆斯,這絕對是比我想出來的更好的方式。 – 2012-07-01 14:32:53

+1

我希望Apple會發布一些關於項目管理的好文檔(甚至是WWDC視頻!)。我每天都要通過試驗和錯誤來發現太多東西 - 其中大部分都是在NeXTSTEP的舊版Project Builder中發現的! – jemmons 2012-07-01 14:37:52

0

您可以使用此

#ifdef Target1 
self.window.rootViewController = [[RootViewController alloc] 
      initWithNibName:@"RootViewControllerTarget1" bundle:nil]; 
#ifdef Target2 
self.window.rootViewController = [[RootViewController alloc] 
       initWithNibName:@"RootViewControllerTarget2" bundle:nil]; 
// etc... 

initWithNibName使用指定的.xib文件中的控制器。 UIViewController initWithNibName:bundle reference

+0

感謝iska,但這不起作用,因爲rootViewController會佔用所有的屏幕。 'splitViewController。viewControllers'預計有一個數組,這裏有2個控制器; 'rootViewController'和''defaultViewController'「 – 2011-12-20 07:09:24

+0

請參閱我編輯的帶2個控制器的版本。 – 2011-12-20 07:18:27

+0

@Adriano您是否檢查過兩個.xib文件中的所有插座和連接?另一件事,它是否適用於一個.xib,但不適用於另一個?或者它們都失敗了? – iska 2011-12-20 15:00:21

0

我從來沒有找到如何通過XIB做到這一點。我最終以編程方式完成了它;我使用一個XIB並根據目標進行填充。