0

アプリの起動時にパスコード/ピンコード(モーダルビューコントローラー)を表示しようとしています。AppDelegate.hにコードが表示される場合があります。

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

    if (![[NSUserDefaults standardUserDefaults] boolForKey:@"passcode_in"]) {
        //display passcode screen
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
        UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"PasscodeViewController"];
        [vc setModalPresentationStyle:UIModalPresentationFullScreen];

        [self presentModalViewController:vc animated:NO]; 


     } else {
        NSLog(@"No Passcode Screen");
}

   return YES;
}

問題は、AppDelegateがモーダルビューコントローラー(presentModalViewController)の表示をサポートしていないことです。.xibファイルは使用せず、アプリにはストーリーボードのみを使用します。誰かがそれの何が悪いのか知っていますか?任意の提案をいただければ幸いです。

解決済み

以前に投稿した質問の1つに与えられた指示に従いましたhttps://stackoverflow.com/a/10303870/1344459PinCodeViewController(modal)のAppDelegate.mの2つのメソッドapplicationDidEnterBackgroundapplicationWillTerminateにいくつかのコードを追加するだけで問題を解決しましたアプリを起動します。今ではとてもスムーズに動作しています。

4

3 に答える 3

0

パスコードがログインの前提条件である場合は、それをログイン パスの一部にすることが理にかなっています。

ストーリーボードでこれを行うには、ナビゲーション コントローラーをペイントし、既定で取得する UITableViewController ルートを削除し、PasscodeViewController をルートとして設定します。次に、そこからプッシュ セグエを LoginViewController に追加します。

PasscodeViewController のロジックは、ここで説明したものと似ています: ViewWillAppear で: パスコード要件が満たされているかどうかを確認できます。必要な場合は、パスコード ビューを表示させて作業を行います。パスコードが既にある場合は、LoginViewController へのセグエを実行します。どちらも必要ない場合は、却下します。

最後に、パスコードが PasscodeViewController によって収集されると、ログインを要求する (LoginViewController へのプッシュ セグエを実行する) か、単にアプリを起動する (閉じる) かを決定できます。

お役に立てば幸いです。

于 2012-04-25T00:11:52.177 に答える
0

presentModalViewControllerUIViewControllerクラスのメソッドです。AppDelegate は NSObject または UIResponder であるため、認識されません。

ストーリーボードの最初の UIViewController に配置して、パスコード/ピンコード ビューを非モーダルに表示する必要があります。

モーダル ビューを表示する必要がある場合は、必要でなくても、AppDelegate からではなく、Storyboard の最初の UIViewController からモーダル ビューを表示します。

UIViewController では、次のように記述します。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"PasscodeViewController"];
    [vc setModalPresentationStyle:UIModalPresentationFullScreen];

    [self performSelector:@selector(presentModal)
               withObject:nil
               afterDelay:0.0];
} 

- (void)presentModal {
    [self presentViewController:vc animated:NO completion:NULL];
}

注意: が必要performSelectorです。使用しない場合、ビューは表示されません。presentModalViewControllerは非推奨になっていることに注意してくださいpresentViewController。代わりに使用してください。

于 2012-04-24T23:35:26.827 に答える
0

同じ問題に対する私の解決策は、ストーリーボードに別のビュー コントローラーを作成し、カスタム セグエを介して最初のビュー コントローラーにリンクし、ViewController の viewDidLoad メソッドでセグエを呼び出すことでした。LoginSegue.h

#import <UIKit/UIKit.h>
@interface LoginSegue : UIStoryboardSegue
@end

LoginSegue.m

    #import "LoginSegue.h"

@implementation LoginSegue

- (void)perform {
    UIViewController *src = (UIViewController *) self.sourceViewController;
    UIViewController *dst = (UIViewController *) self.destinationViewController;
    [UIView transitionWithView:src.navigationController.view duration:0.0
                       options:UIViewAnimationTransitionNone
                    animations:^{
                        [src.navigationController presentViewController:dst animated:NO completion:nil];
                        }
                    completion:NULL];
}
@end

次に、ストーリーボードでセグエを選択し、セグエ クラスを LoginSegue に設定し、識別子を好きなものに設定します。私は @"toLogin" です。そして、viewDidLoad に以下を含めます。

[self performSegueWithIdentifier:@"toLogin" sender:self];
于 2012-04-24T23:33:31.743 に答える