2010-05-03 79 views
43

我通常創建沒有IB-stuff的項目。我做的第一件事就是去除所有對xibs的引用,更新plist等的出處,等等。沒有問題,很好(在我的世界)!UISplitViewController以編程方式沒有nib/xib

現在,我剛剛安裝了3.2,並試圖開發我的第一個iPad應用程序。按照之前的相同過程,我創建了一個基於UISplitView的應用程序項目,並剝離了所有IB內容。另外,我遵循蘋果參考文檔中的部分:Creating a Split View Controller Programmatically,但是,儘管如此,主視圖從不顯示,只有細節視圖(不管方向是什麼)。我真的很想仔細看看,但我不明白我錯過了什麼。

是否有一個UISplitViewController的工作示例,而不是在某個地方浮動筆尖?我已經Google搜索,但找不到任何。或者你知道我可能錯過了什麼?

+8

「我通常創建我的項目沒有IB的東西。」 < - +1。這就是編程工作的方式,我也這樣做。你搖滾! – 2012-10-28 05:54:48

回答

55

聲明你splitviewcontroller在您的代理頭,使用這樣在你didfinishlaunching

確保您的UISplitViewControllerDelegate添加到detailedViewController頭文件以及是否有委託方法以及。記得導入相關的頭文件

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{  

    splitViewController = [[UISplitViewController alloc] init]; 

    rootViewController *root = [[rootViewController alloc] init]; 
    detailedViewController *detail = [[detailedViewController alloc] init]; 

    UINavigationController *rootNav = [[UINavigationController alloc] initWithRootViewController:root]; 

    UINavigationController *detailNav = [[UINavigationController alloc] initWithRootViewController:detail]; 

    splitViewController.viewControllers = [NSArray arrayWithObjects:rootNav, detailNav, nil]; 
    splitViewController.delegate = detail; 

    [window addSubview:splitViewController.view]; 

編輯 - 按斯科特的下方很好的建議,不代碼添加到Windows子視圖,而不是

[self.window setRootViewController:(UIViewController*)splitViewController]; // that's the ticket 
    [window makeKeyAndVisible]; 
    return YES; 
} 


//detailedView delegate methods 
- (void)splitViewController:(UISplitViewController*)svc 
    willHideViewController:(UIViewController *)aViewController 
      withBarButtonItem:(UIBarButtonItem*)barButtonItem 
     forPopoverController:(UIPopoverController*)pc 
{ 
    [barButtonItem setTitle:@"your title"]; 



    self.navigationItem.leftBarButtonItem = barButtonItem; 
} 


- (void)splitViewController:(UISplitViewController*)svc 
    willShowViewController:(UIViewController *)aViewController 
    invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    self.navigationItem.leftBarButtonItem = nil; 
} 

我也喜歡IB ;-)

+5

這個答案正是我一直在尋找的。一個問題:在Apple的參考示例代碼(http://developer.apple.com/library/ios/ipad/#samplecode/MultipleDetailViews/Listings/Classes_RootViewController_m.html)中,他們處理根視圖控制器中的UiSplitviewcontroller委託。您可以在詳細的控制器中處理它。有一種方式或其他方式的理由嗎? – 2010-12-18 19:02:34

+0

成爲代表的控制器取決於您。如果你覺得'detailViewController'要去*命令*'rootViewController'完全沒問題:)。儘管在這種情況下,您可能想要將變量重命名爲適合您設計的內容(例如,分別爲'rootViewController'和'detailedViewController'的'listViewController'和'mainViewController') – nacho4d 2012-08-15 16:30:42

22

Oldish線程,但認爲當上述技術未能生成對設備方向更改事件正確響應的UISplitViewController時,我會爲讀者提供時間+悲傷。您需要:

  1. 確保所有從屬視圖在 shouldAutorotateToInterfaceOrientation中正確響應。這裏沒有新東西。
  2. 而非UISplitViewController的視圖添加到主窗口中,

    [window addSubview:splitViewController.view]; // don't do this 
    

    代替設置主窗口的根控制器向UISplitViewController:

    [self.window setRootViewController:(UIViewController*)splitViewController]; // that's the ticket 
    

添加splitviewcontroller的視圖作爲一個子視圖的主窗口(幾乎不允許)允許它與兄弟視圖共同呈現,但它不會隨UISplitViewController的預期用例一起飛行。 UISplitViewController是一個高地視圖; 只能有一個

3

我剛剛遇到了同樣的問題。 請確保您的子視圖控制器的splitview可以自動旋轉到界面方向。

你可以改變功能的childViewController這樣的:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

則主視圖將顯示。

+1

我愛你!我的問題解決了! – mineschan 2012-12-13 06:39:32

相關問題