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


248

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

私はそれがIBで比較的簡単にできることを知っていますが、それはオプションではありません。

私がしたいことの例は、家のスプラッシュスクリーンを備えた2つのビューコントローラーがある場合です。もう1つのビューコントローラーには家が通り抜け、すべての部屋を設定された順序で通り抜けることができました。スプラッシュスクリーンには、各部屋にボタンがあり、ウォークスルーの任意のポイントにジャンプできます。

回答:


538

次のようにデリゲートにアクセスできます。

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

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

次に、他のビューコントローラーのプロパティがある場合は、次のように呼び出すことができます。

[appDelegate.viewController someMethod];

12
また、appDelegate.hファイルを使用する場所にインポートするか、@ class appDelegateを実行する必要がある場合があります
Zaky German

3
appDelegate.hファイルは、ターゲットのプレフィックス/プリコンパイル済みヘッダーファイルIMOに移動するのに適した候補です。
mharper

48
@mharperのようにPrefix.pchにアプリデリゲートをインポートする場合、これを同時に追加することもできます:#define AppDelegate((MyAppDelegateClass *)[UIApplication sharedApplication] .delegate)これにより、次のようにアプリデリゲートにアクセスできます'[AppDelegate.viewController someMethod]'。それは少し単純化しますが、それを悪用しやすくします。
ケニーLövrin

アプリのdelegate.hファイルの@endの後に、#define AppDelegate((MyAppDelegateClass *)[UIApplication sharedApplication] .delegate)を追加しました。アプリのデリゲートをインポートするどのクラスでも、[AppDelegate.viewController someMethod]を直接使用できます
harveyslash

43

そして、誰かがこれをどのように行うのか疑問に思っている場合swift

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

appDelegate = UIApplication.sharedApplication()。delegate as?AppDelegate {}は、より迅速なアプローチです。
cbartel 2016

@petrsynデリゲートはどういう意味nilですか?アプリには常にAppDelegateがあるのではないですか?
ハニー、

Swiftの最近のバージョンでは、sharedApplication()に置き換える必要がありsharedます。つまり、「アプリケーション」と括弧を削除します。スウィフト5.2のように完全に動作するコードは、そうでしょう: if let myDelegate = UIApplication.shared.delegate as? AppDelegate { myDelegate.someMethod() }
sfarbota

41

あなたはちょうど必要なように聞こえます UINavigationControllerセットアップですか?

あなたAppDelegateはプログラムのどこにでも行くことができます

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

アプリのデリゲートでは、IBまたはコードを使用して、ナビゲーションコントローラーをセットアップする必要があります。

コードでは、「House overview」ビューコントローラをすでに作成していると仮定すると、次のようになりますAppDelegate didFinishLaunchingWithOptions...

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];

この後は、「部屋」ごとにビューコントローラーが必要であり、ボタンクリックイベントがピックアップされたときに次を呼び出します...

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

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


8
あなたの答えも正しいです。私はクリスチャンの答えとあなたの答えの組み合わせを使用してしまいました。チェックマークを分割したいです。
Mytheral

15

これが私のやり方です。

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

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

#import "AppDelegate.h"

13

次の手順に従ってください

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

私は最初のものをお勧めします。実行してください。


これは特にデリゲートの新しいインスタンスではなく、シングルトンアプリケーションのシングルトンデリゲートを取得します
Ammo Goettsch 2017年

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

AppDelegate.hをどこにでも含める必要がなくなります。それは長い道のりをたどる単純なキャストであり、独立したコントローラーを開発し、クラス名などを心配することなく他の場所でそれらを再利用することを可能にします...

楽しい


共有してくれてありがとう、それは私を数分間幸せにします、おそらくそれは何らかの方法で機能しますが、そこからvisibleViewControllerのようなメソッドを使用したい場合はどうなりますか?次のようなエラーが発生します:タイプ 'NSObject <UIApplicationDelegate> *のオブジェクトにプロパティ' visibleViewController 'が見つかりません。これに対する解決策はありますか?
mgyky

8

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

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

以上です。定数のように、アプリケーション全体で使用します。

例えば

[kAppDelegate methodName];

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


7

Xamarinで同じものが必要な場合(Xamarin.ios / Monotouch)、これは私にとってはうまくいきました:

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

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


Swiftの正しいステートメントはlet appdel:AppDelegate = UIApplication.shared.delegate as!です。AppDelegate
Phil

5

そして、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")
}

次のようにしてコントローラから上記のメソッドを呼び出す

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

    appDelegate.someMethodInAppDelegate()
}

出力:

ここに画像の説明を入力してください


3

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

[uAppDelegate showLoginView];

0

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

このアプローチはAppleのガイドラインに従っておらず、多くの欠点があります。


質問の日付を見てください... Interface Builderが独立したアプリケーションであり、開発がまったく異なる獣だったのは、昔からです。私は何年もiOS開発に触れていなかったので、より現代的な答えを評価することはできません。
Mytheral

それはそうかもしれませんが、私の考慮​​事項はまだ有効です
ingconti

0

2020年、iOS13、xCode 11.3。Objective-Cの機能は次のとおりです。

#import "AppDelegate.h"

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

それは私のために働いています、私はあなたにも同じことを望みます!:D

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.