10

WebとStackOverflowを何時間も検索してきましたが、この問題を解決できません。私はそれを見つけることができないので、皆さんが私の間違いを見てくれることを願っています。

始めたばかりのシンプルなストーリーボードベースのアプリケーションがあります。最初のViewControllerは、テンプレートからの2つのダミーViewControllerを持つUITabBarControllerのインスタンスです。起動時に、デバイスが外部サービスにログインしているかどうかを確認する必要があります。そうでない場合は、ユーザーが認証できるようにするモーダルViewControllerを表示します。デバイスが認証されている場合は、FirstViewControllerのみを表示します。

次の手順は、プロジェクトの作成以降に行ったすべての手順です。

  1. ストーリーボードにAuthenticateViewControllerシーンを作成します
  2. AuthenticateViewControllerのコードファイルを作成し、対応するシーンに割り当てます
  3. UITabBarControllerサブクラスのコードファイルを作成し、最初のUITabBarControllerシーンをその新しいサブクラスに関連付けます
  4. UITabBarControllerシーンからAuthenticateViewControllerシーンまでのストーリーボードに新しいセグエを作成します
  5. viewDidLoadUITabBarControllerサブクラスからセグエを手動で呼び出す

アプリケーションを実行すると、モーダルセグエが起動せず、UITabBarControllerの最初のViewControllerが表示され、XCodeで次の出力が得られます。

Warning: Attempt to present <AuthenticateViewController: 0x83c0c10> on <EPTabBarController: 0x83be600> whose view is not in the window hierarchy!

以下の関連コード、実際、これまでに追加した唯一のコード。スクリーンショットや追加情報が役立つかどうか教えてください。よろしくお願いします。

EPTabBarController、UITabBarControllerのサブクラス:

#import "EPTabBarController.h"
#import "AuthenticateViewController.h"

@interface EPTabBarController ()

@end

@implementation EPTabBarController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self performSegueWithIdentifier:@"authenticationSegue" sender:self];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
4

3 に答える 3

14

問題は内部にあります

- (void)viewDidLoad
{
    [super viewDidLoad];    
    [self performSegueWithIdentifier:@"authenticationSegue" sender:self];
}

現在のview( )がウィンドウ階層にまだロードされていないときに、別のview( AuthenticateViewController)を表示しようとしています。EPTabBarController

したがって、最初EPTabBarControllerにウィンドウ階層にロードしてから、を表示しますAuthenticateViewController

これを試してみてください

- (void)viewDidLoad 
{
    [super viewDidLoad];        
    [self performSelector:@selector(loadAuthenticateViewController) 
               withObject:nil 
               afterDelay:1.0];
}

-(void)loadAuthenticateViewController 
{
    [self performSegueWithIdentifier:@"authenticationSegue" sender:self];
}
于 2013-03-25T04:56:16.293 に答える
3

viewDidAppearでコードを呼び出すだけではどうでしょうか。

- (void)viewDidAppear
{
    [super viewDidAppear];    
    [self performSegueWithIdentifier:@"authenticationSegue" sender:self];
}

ただし、元のビューがほんの一瞬しか表示されないため、これらのソリューションにはまだ満足できません。

最初に元のビューを表示せずに新しいモーダルを表示する方法について何かアイデアはありますか?

于 2014-06-10T07:51:28.210 に答える
2

本当にコントロールしたい場合は、次のようなものを使用してください。

@implementation UeInitialisationViewController
BOOL didLoad;
BOOL wantPush;

- (id)init {
    self = [super init];
    if (self) { didLoad = NO; wantPush = NO; }
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    didLoad = YES;
    if (wantPush == YES)
        [self performSelector:@selector(pushToMainView) 
                   withObject:nil afterDelay:0.0001];
}

- (void)pushToMainView {
    if (didLoad == YES)
        [self performSegueWithIdentifier:@"pushToMainView" sender:self];
    else
        wantPush = YES;
}
@end

pushToMainViewこれにより、メッセージを送信したときにSegueが起動されます[controller pushToMainView]が、ビューが読み込まれるまで保留されます。

于 2013-10-06T10:35:05.893 に答える