2011-01-12 33 views
1

(最後的解決方案在底部)如何在普通的UIViewController之後設置一個自定義的UIViewController?

我想設置一個iPad應用程序,將有一個初始登錄視圖。當用戶點擊動作時,它應該重定向到主視圖。 最初我設置了一個UIViewController來處理登錄視圖。從那裏我想使用自定義視圖控制器顯示下一組視圖。

我創建一個處理一個LoginView一個LoginViewController,加入這個觀點到從AppDelegate中的窗口:

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

    loginViewController = [[LoginViewController alloc] init]; 
    [self.window addSubview:loginViewController.loginView]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

而且我LoginViewController界面如下:

@interface LoginViewController : UIViewController { 
    UIView *loginView; 
    UITextField *usernameTextField; 
    UITextField *passwordTextField; 
    UIButton *submitButton; 
} 
@property (nonatomic, retain) IBOutlet UIView *loginView; 
@property (nonatomic, retain) IBOutlet UITextField *usernameTextField; 
@property (nonatomic, retain) IBOutlet UITextField *passwordTextField; 
-(IBAction)submit; 
-(void)setupTextFields; 
@end 

我是什麼試圖做的是添加一個HomeViewController,它將擴展UIViewController類,在我的LoginViewController中,這樣當我的loginView中的動作按鈕被按下時,它會加載新的自定義視圖控制器。

但是,當我這樣做時,由HomeViewController處理的初始顯示圖像渲染不正確。當它應該是肖像和反之時,它似乎顯示風景。

我希望登錄視圖顯示在視圖堆棧的底部,以便能夠在單擊註銷操作時回到此登錄視圖。

我認爲我對這個問題的處理方法是錯誤的。任何人都可以將我引入最佳解決方案嗎?我怎樣才能做到這一點?


繼@Jonah提出的解決方案後,我切換homeViewController是在AppDelegate中創建的,並呼籲displayLoginModalViewController如下:

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

    homeViewController = [[HomeViewController alloc] init]; 
    [homeViewController displayLoginModalViewController]; 
    [self.window addSubview:homeViewController.homeView]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

displayLoginModalViewController的實現如下:

-(void)displayLoginModalViewController{ 
    LoginViewController *loginViewController = [[LoginViewController alloc] init]; 
    loginViewController.modalPresentationStyle = UIModalPresentationFullScreen; 
    loginViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
    [self presentModalViewController:loginViewController animated:YES]; 
} 

我曾嘗試在添加之前和之後調用displayLoginModalViewController方法添加到窗口,它不會渲染模態視圖。我覺得我在這裏失去了一些東西。當從homeView按下注銷操作時,該方法會呈現模態視圖,而不是在應用程序啓動時。

我還在didFinishLaunchingWithOptions:presentModalViewControllerdisplayLoginModalViewController方法中添加子視圖之後放置了NSLog s。兩個NSLog都顯示在我的控制檯中,我只是不知道它爲什麼不顯示模態視圖。

============================================== ==============================================

感謝您提供的選項。我決定走模態路線。不幸的是,當我最初設置它時,我以錯誤的方式處理了這個問題。

當涉及到模態視圖,顯然他們需要用戶交互。這意味着他們只能在用戶完成某項操作後才能呈現。當我第一次想要將登錄設置爲模態視圖並將我的主視圖保留爲我的主視圖時,僅在啓動時才顯示模態視圖。它需要採取行動。

在盯着屏幕幾個小時後,我決定停止固執,並使用登錄作爲我的主屏幕並將主視圖顯示爲模式。這不僅解決了啓動時顯示登錄的問題,而且還有助於設置,我希望能夠在不退出應用程序的情況下將用戶從應用程序中註銷,並簡單地從該點釋放所有內存使用情況。

回答

1

登錄視圖非常適合模態視圖控制器。看一看UIViewController的-presentModalViewController:作爲一種機制來呈現您的登錄視圖控制器「在」其他視圖控制器當前正在填充您的窗口的頂部。

3

您應該改用UINavigationController。 大多數應用程序都採用這種方法,即使導航欄已隱藏,視圖已蒙上膚色,或從右側看不到動畫,通常會有一個UInavigationController。

它負責將viewController推到彼此頂部,顯示內容,顯示等。另一種方法是做UINavigationController手動執行的操作。 這將涉及您的viewController有一個變量來存儲下一個viewController,然後將第二個viewControllers視圖添加到第一個viewController ...(這是很多工作的方式,所以儘量避免這種方法作爲您的基礎)

This是必讀閱讀。我瀏覽了不同的viewController容器,以及何時使用它們 - 這只是在事情變得非常複雜之前所需要的東西。 ViewController Programming Guide

+0

我也必須upvote你的答案了。我結束了兩者的結合。從loginViewController呈現navigationController的模式視圖控制器。 – 2011-01-27 23:05:44

+0

很酷。希望你能以內存/可維護的方式運行它。 viewController容器就像一個可可觸摸框架中的模式,如果你熟悉它們,它將有助於用戶的開發時間和易用性。 – RickiG 2011-01-28 12:40:34

相關問題