2012-01-05 12 views
1

新しいインスタンスを作成せずにこれにアクセスする方法はありますか?私が使用してセグエを実行するよう:iOS - アプリケーションの初期ViewControllerインスタンス

[self performSegueWithIdentifier:@"loginSegue" sender:sender]; 

を私がしようとすると、インスタンスを作成する場合は、コンパイラはセグエが存在しないことを言います。新しいインスタンスを作成する理由は、別のクラスからViewControllerクラスのメソッドを呼び出すためです。最初に作成されたインスタンスからメソッドを実行する方法はありますか?

答えて

2

UIViewControllerインスタンスを[UIStoryboard instantiateViewControllerWithIdentifier:]メソッドを使用して作成していますか? alloc-initでインスタンス化すると、インスタンスがstoryboardからインスタンス化されないため、segueには接続されません。

ここでは、UIStoryboardクラスを参照しています。

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIStoryboard_Class/Reference/Reference.html

+0

私は決してそれを個人的に作成していません。私はあなたのようにストーリーボードを使用しています。作成するインスタンスにアクセスする方法はありますか? –

+0

ありますが、残念ながらそれほど便利ではありません。 UIApplicateDelegate.windowからviewcontroller階層を1つずつトラバースする必要があります。 ApplicationDelegateのself.windowのルートビューコントローラとして設定されているタブバーコントローラの最初の項目にアクセスしている場合、[self.window.rootViewController.viewControllerers objectAtIndex:0]。 – barley

+0

ああ、私はタイトルの最初のviewcontrollerを言ったことを忘れてしまった。最初のviewcontrollerはウィンドウのrootviewcontrollerなので、appDelegate.window.rootViewControllerlerはそうするでしょう。 – barley

0

このオブジェクトの最初に作成されたインスタンスを静的変数に保存し、それにアクセスする静的メソッドを定義することができます。

static MyViewController *sharedInstance = nil; 

@implementation MyViewController 

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle 
{ 
    ... init code here ... 

    if (!sharedInstance) { 
    sharedInstance = self; 
    } 

    return self; 
} 

- (id)initWithCoder:(NSCoder *)decoder 
{ 
    ... init code here ... 

    if (!sharedInstance) { 
    sharedInstance = self; 
    } 

    return self; 
} 

+ (MyViewController *)sharedInstance 
{ 
    if (!sharedInstance) 
    [[[self alloc] init] autorelease]; // will be retained inside the init method 

    return sharedInstance; 
} 

@end 

はその後、どこか他のアプリでは、使用してその変数にアクセスすることができます

[MyViewController sharedInsatnce]; 

それは非常に一般的に使用されるパターンではない、といくつかの欠点があります(例:それは割り当てが解除されることはありません。それはあまりにも多くのメモリを使用しないことを確認します)が、UIKit/Foundationのいくつかのクラス(NSFileManager、NSUserDefaults、NSBundleなど)を使用します。

関連する問題