2011-06-15 169 views
0

我想從常規視圖控制器呈現NavigationController。當我展示導航控制器時,我所看到的只是默認的導航欄(無論我在IB中設置了什麼),這讓我覺得導航控制器在IB中並不受歡迎。這是我的代碼來打開導航控制器:呈現導航控制器

NavigationController *navController = [[NavigationController alloc] initWithNibName:@"NavigationController" bundle:[NSBundle mainBundle]]; 
[self presentModalViewController:navController animated:YES]; 

這裏是我的NavigationController標題:

@interface NavigationController : UINavigationController <UINavigationControllerDelegate> { 
    UINavigationController *navigationController; 
} 

@property (nonatomic,retain) IBOutlet UINavigationController *navigationController; 

@end 

而且navigationController在實施合成。

在IB中,我有一個導航控制器連接到navigationController和文件的所有者代理。我究竟做錯了什麼?由於

編輯:這就是它看起來像在IB: IB 這是什麼樣子的模擬器: Simulator

+0

我不認爲你目前的設置是你所需的東西。你介意告訴我們一些關於你想用導航控制器做什麼的事情嗎?您是否希望爲現有的UINavigationController添加功能,或者您是否希望製作一個基於導航的應用程序(類似於郵件或音樂),從而爲您提供後退按鈕和漂亮的動畫。 – 2011-06-15 21:46:14

+0

@Scott Rice我已經有一個應用程序,只是我想添加一個導航控制器。我得到它的工作後,我將添加一個表視圖。 – Preston 2011-06-15 21:50:18

回答

2

什麼你現在已經是一個UINavigationController的子類。如果你想爲UINavigationController添加自定義功能(就像在視圖之間做一個不同的動畫),那就是你想要做的。因爲聽起來你想製作一個基於導航的應用程序,實際上你只是想使用普通的UINavigationController類。這就是你必須做什麼才能讓UINavigationController與你想要的內容建立起來。 (我在Code中這樣做,因爲我討厭在IB中設置UINavigationController)。

在你的applicationDidFinishLaunching中,你想添加這一點代碼。

// (SomethingApplicationDelegate.m) 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Assume that 'window' is your main window, and 'viewController' is the property 
    // that is automatically created when you do a new view controller application. 
    // 
    // Also, assume that 'ContentViewController' is the name of the class that display 
    // the table view. This will most likely be a subclass of UITableViewController 
    ContentViewController *content = [[ContentViewController alloc] init]; 
    UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:content]; 
    [viewController.view addSubview:nvc.view]; 
    // This is the boilerplate code that is generated when you make a new project 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

這將創建一個UINavigationController並設置您的表視圖作爲其內容。當你想要做的漂亮的動畫到一個新的觀點,你這樣做

// This will be inside your ContentViewController 
// Assume that 'NewViewController' is the class of the view controller you want 
// to display 
NewViewController *viewController = [[NewViewController alloc] init]; 
[self.navigationController pushViewController:viewController]; 
[viewController release] 

這將自動進行動畫滑動到下一個視圖控制器,以及製作漂亮的後退按鈕帶你回到你的ContentViewController

編輯:爲了使導航控制器顯示爲模式視圖控制器,這就是你要做的。您可以這樣做,而不是在應用程序委託中使用上面的代碼。

-(IBAction)buttonPushed:(id)sender { 
    // Assume this method is in a UIViewController subclass. 
    // 
    // The next two lines are copied from above in the Application Delegate, the same assumptions 
    // apply about ContentViewController 
    ContentViewController *content = [[ContentViewController alloc] init]; 
    UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:content]; 
    // This is the magic code 
    [self presentModalViewController:nvc]; 
} 

然後,當您正在使用導航控制器完成,並希望它走,你這樣做:

// Assume we are in some method in ContentViewController, or a similar view controller that is showing content 
[self.navigationController dismissModalViewController]; 
+0

謝謝,但我不需要導航控制器在應用程序啓動時顯示。我需要它在用戶按下按鈕後模態呈現。我將如何修改此代碼才能做到這一點? – Preston 2011-06-16 00:18:50

+0

這沒問題,讓我編輯代碼來做到這一點。 – 2011-06-16 00:28:51

+0

它完美的工作,我不知道這是很簡單的事情。非常感謝你。 – Preston 2011-06-16 00:49:54

0

navigationController.view默認爲空,你將不得不把一些東西那裏。

+0

當我在模擬器中打開導航控制器時,它會在頂部顯示一個藍色(默認)導航欄。這是否意味着應用程序沒有顯示與導航控制器相對應的正確視圖? – Preston 2011-06-15 21:52:44

+0

不需要,使用[navigationController.view addSubview:someView];要添加一個視圖,在導航項目中它會自動啓動並設置它來添加rootViewController.view。 – 2011-06-15 22:06:03

+0

當我在導航控制器出現之前添加[navigationController.view addSubview:tableView.view]時,它會在沒有導航欄的屏幕的一半處出現表格視圖。 – Preston 2011-06-15 22:21:35

1

在你的viewDidLoad中聲明一個導航控制器? 這樣:

UINavigationController *navController = [[UINavigationController alloc] 
              initWithRootViewController:view]; 
+0

仍顯示相同的事情。使用圖片更新OP – Preston 2011-06-15 22:42:48