web-dev-qa-db-ja.com

iOS - ViewControllerからApp Delegateメソッドを呼び出す

私がやろうとしているのは、(コードで作成された)ボタンをクリックし、それに別のView Controllerを呼び出しさせてから、それを新しいView Controllerで関数を実行させることです。

IBでは比較的簡単にできることを私は知っていますが、それは選択肢ではありません。

私がやりたいことの例は、あなたが家のスプラッシュスクリーンを持つ2つのView Controllerを持っている場合です。もう一方のView Controllerは家の中を通り抜けているので、すべての部屋を順番に並べることができます。スプラッシュスクリーンには、各部屋用のボタンがあり、そこを通過することで任意の場所にジャンプできます。

238
Mytheral

あなたはこのようにデリゲートにアクセスすることができます:

MainClass *appDelegate = (MainClass *)[[UIApplication sharedApplication] delegate];

MainClassをアプリケーションクラスの名前に置き換えます。

それから、もう一方のView Controllerのプロパティがあれば、次のように呼び出すことができます。

[appDelegate.viewController someMethod];
527
Cristian Radu

UINavigationControllerの設定が必要なだけのようですね。

次のようにして、プログラム内のどこにでもAppDelegateを取得できます。

YourAppDelegateName* blah = (YourAppDelegateName*)[[UIApplication sharedApplication]delegate];

あなたのアプリデリゲートでは、IB経由またはコードでナビゲーションコントローラーを設定する必要があります。

コードでは、 'House overview'ビューコントローラをすでに作成していると仮定すると、それはAppDelegatedidFinishLaunchingWithOptions...の中でこのようになります。

self.m_window = [[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds] autorelease];
self.m_navigationController = [[[UINavigationController alloc]initWithRootViewController:homeViewController]autorelease];
[m_window addSubview:self.m_navigationController.view];

この後は、 'room'ごとにviewcontrollerが必要になり、ボタンクリックイベントが発生したときに次のコードを呼び出すだけです。

YourAppDelegateName* blah = (YourAppDelegateName*)[[UIApplication sharedApplication]delegate];
[blah.m_navigationController pushViewController:newRoomViewController animated:YES];

私は上記のコードをテストしていないので構文エラーを許しますが、疑似コードが助けになることを願っています...

41
sradforth

そしてSwiftでこれを行う方法を誰かが疑問に思う場合は、

if let myDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
   myDelegate.someMethod()
}
39
canhazbits

これが私のやり方です。

[[[UIApplication sharedApplication] delegate] performSelector:@selector(nameofMethod)];

インポートすることを忘れないでください。

#import "AppDelegate.h"
15
mikemike396

以下の手順に従ってください

1.アプリデリゲートオブジェクトが必要なクラスに、アプリデリゲートをインポートします。

#import "YourAppDelegate.h"

2.あなたのクラスの内側にあなたのアプリデリゲートオブジェクトのインスタンスを作成します(それは基本的にはシングルトンです)。

YourAppDelegate *appDelegate=( YourAppDelegate* )[UIApplication sharedApplication].delegate;

3.セレクタを使ってメソッドを呼び出す

if([appDelegate respondsToSelector:@selector(yourMethod)]){

        [appDelegate yourMethod];
    }

または直接

[appDelegate yourMethod];

スイフト用

let appdel : AppDelegate = UIApplication.shared.delegate as! AppDelegate

私は最初のものをお勧めします。実行して行きます。

12
NSObject <UIApplicationDelegate> * universalAppDelegate = 
    ( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];

AppDelegate.hをいたるところにインクルードする必要がなくなります。これは、クラス名などを気にすることなく、独立したControllerを開発して他の場所でそれらを再利用することを可能にする、簡単なキャストです。

楽しい

11

たくさんの良い答えがすでに追加されています。私はほとんどの場合私に合ったものを追加したいのですが。

#define kAppDelegate ((YourAppDelegate *)[[UIApplication sharedApplication] delegate]);

以上です。アプリケーション全体で定数のように使用してください。

例えば.

[kAppDelegate methodName];

対応する.pchファイルまたはマクロファイルにyourAppDelegate.hをインポートすることを忘れないでください。

8
ZaEeM ZaFaR

誰かがXamarin(Xamarin.ios/Monotouch)で同じことを必要とするなら、これは私のために働きました:

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

(UIKitを使用する必要があります。)

7
Daniele D.

また、watchOSのView ControllerからWatchKitエクステンションデリゲートにアクセスする必要がある場合は、次のようにします。

extDelegate = WKExtension.sharedExtension().delegate as WKExtensionDelegate?
5

Swift 3.0以降用のアップデート

//
// Step 1:- Create a method in AppDelegate.Swift
//
func someMethodInAppDelegate() {

    print("someMethodInAppDelegate called")
}

followsからあなたのコントローラから上記のメソッドを呼び出す

//
// Step 2:- Getting a reference to the AppDelegate & calling the require method...
//
if let appDelegate = UIApplication.shared.delegate as? AppDelegate {

    appDelegate.someMethodInAppDelegate()
}

出力:

enter image description here

3
iAj

プロジェクトのPrefix.pchファイルに#define uAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate]を追加してから、以下のコードで任意のAppDelegate内の任意のUIViewControllerのメソッドを呼び出すことができます。

[uAppDelegate showLoginView];
3
Ada

技術的に実現可能であっても、それは良いアプローチではありません。あなたが言うとき:「スプラッシュスクリーンはあなたが通り抜けてのあらゆる点にジャンプすることを可能にするであろう各部屋のためのボタンを持つでしょう。」それであなたはボタン上のtohcイベントを通してこれらのコントローラを呼び出すためにappdelegateを通過したいですか?

この方法はAppleのガイドラインには従っておらず、多くの欠点があります。

0
ingconti