2011-01-12 12 views
1

(最終的な解決策)一般的なUIViewControllerの後にカスタムUIViewControllerを設定するにはどうすればいいですか?

初期ログイン表示を持つiPadアプリを設定しようとしています。ユーザーがアクションをクリックすると、ホームビューにリダイレクトされます。 最初は、ログインビューを処理するUIViewControllerを設定していました。そこから、カスタムビューコントローラーを使用して、次のビューグループを表示したかったのです。次のように

- (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 

私は何だったの

私はAppDelegateからウィンドウに、このビューを追加し、loginViewを扱うLoginViewControllerを作成しています私のLoginViewController内のUIViewControllerクラスを拡張するHomeViewControllerを追加して、loginView内のアクションボタンが押されたときに新しいカスタムView Controllerをロードするようにしました。

しかし、私はそのように行う際に、HomeViewControllerで扱う初期表示された画像が正しく表示されます。それは肖像画でなければならないときに風景を表示するように見えます。

私はログアウトアクションがクリックされたときに、このログインビューに戻ってくることができるようにするために、ビューのスタックで一番下に表示されるログインビューを持っていると思います。

私はこの問題に対する私のアプローチが間違っていると思います。誰も私を最良の解決策に導くことができますか?どうすればこれを達成できますか? @Jonahによって提案された解決策に従った後


、私はAppDelegateに作成したものであることをhomeViewControllerを切り替えて、次のように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]; 
} 

の追加前後はウィンドウに表示され、モーダル表示はレンダリングされません。私はここに欠けているものがあるように感じる。このメソッドは、ログアウトアクションがhomeViewから押されたときにモーダルビューをレンダリングします。アプリケーションが起動していないときだけです。

また、didFinishLaunchingWithOptions:presentModalViewControllerdisplayLoginModalViewControllerの方法でサブビューを追加した後にNSLogsを配置しました。両方ともNSLogが私のコンソールに表示されますが、私はモーダルビューを表示していない理由はわかりません。

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

提供されたオプションをありがとう。私はモーダルルートに行くことに決めました。残念ながら私が最初にそれを設定していたとき、私は問題に間違った方法で近づいていました。それはモーダルビューに降りてきたとき

は、どうやら彼らは、ユーザーの操作を必要としています。これは、ユーザーが行った操作の後にのみ表示できることを意味します。私が最初にモーダルビューとしてログインを設定し、私のメインビューとして私のホームビューを維持したいとき、モーダルビューを起動時に表示することはできませんでした。それは行動を必要とした。

数時間画面を見た後、私は頑固になるのを止め、メイン画面としてログインを使用し、ホームビューをモーダルとして表示することに決めました。これは、起動時にログインを表示する問題を解決するだけでなく、セットアップを助けるだけでなく、アプリケーションを終了してその時点からすべてのメモリ使用量を解放することなく、ユーザーをアプリからログアウトできるようにしたかったのです。

答えて

1

ログインビューは、モーダルビューコントローラに適しています。 UIViewControllerの-presentModalViewControllerを見てみましょう。現在、あなたのウィンドウを満たしている他のView Controllerがあれば、あなたのログインビューコントローラを「上に」表示するためのメカニズムです。

+0

[ログアウト]ボタンを押すとどうなりますか?モーダルビューを再度表示するだけですか? –

+0

あなたの選択は私がしたいことに非常に適していると思います。インスタンス化されたときに、どのようにアプリがモーダルビューコントローラを読み込ませることができますか? initWithNibNameメソッドにコードをいくつか入れましたが、ロードしていないようです。 –

+0

アプリケーションデリゲートの '-application:didFinishlaunchingWithOptions:'でHomeViewControllerを作成してウィンドウに追加します。次に、あなたが投稿した例のようにLoginViewControllerをインスタンス化し、それをあなたのHomeViewControllerインスタンスの '-presentModalViewController:animated:'メソッドに渡します。あなたのHomeViewControllerはそれ自体の上にLoginViewControllerを表示します。 LoginViewControllerはそれ自体を却下するか、ログインが完了したことをHomeViewControllerに通知し、HomeViewControllerは '-dismissModalViewControllerAnimated:'を使ってそれを却下することができます。 – Jonah

3

代わりにUINavigationControllerを使用する必要があります。 ナビゲーションバーが隠されている、ビューがスキニングされている、または右からアニメートされていないにもかかわらず、ほとんどのアプリはこのアプローチを採用しています。そこにはしばしばUInavigationControllerがあります。

viewControllerを互いに重ねて、メモリ上に表示するなどの構造を担当します。代わりに、UINavigationControllerが手動で行うことを行うこともできます。 これは、あなたのviewControllerに次のviewControllerを格納する変数を持たせてから、最初のviewControllerビューに2番目のviewControllersビューを追加することです(多くの方法でこのアプローチがあなたの基礎であることを避けてください)

これはでなければなりません。私は別のviewControllerコンテナを使用し、それらをいつ使用するか - 物事が本当に複雑になる前に必要なものです。 ViewController Programming Guide

+0

私もあなたの答えをupvoteする必要があります。私は両方の組み合わせを終了しました。 loginViewControllerからnavigationControllerのモーダルビューコントローラを提示します。 –

+0

Cool。あなたはそれがメモリ/保守可能な方法で実行していることを望みます。 viewControllerコンテナは、ココアのタッチフレームワーク内のパターンに似ていて、ユーザーが慣れていれば、開発時間と使いやすさの両方に役立ちます。 – RickiG

関連する問題