回答:
次のようにデリゲートにアクセスできます。
MainClass *appDelegate = (MainClass *)[[UIApplication sharedApplication] delegate];
MainClassをアプリケーションクラスの名前に置き換えます。
次に、他のビューコントローラーのプロパティがある場合は、次のように呼び出すことができます。
[appDelegate.viewController someMethod];
そして、誰かがこれをどのように行うのか疑問に思っている場合swift
:
if let myDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
myDelegate.someMethod()
}
nil
ですか?アプリには常にAppDelegateがあるのではないですか?
sharedApplication()
に置き換える必要がありshared
ます。つまり、「アプリケーション」と括弧を削除します。スウィフト5.2のように完全に動作するコードは、そうでしょう: if let myDelegate = UIApplication.shared.delegate as? AppDelegate { myDelegate.someMethod() }
あなたはちょうど必要なように聞こえます 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];
私は上記のコードをテストしていないので、構文エラーは許しますが、疑似コードが役立つことを願っています...
これが私のやり方です。
[[[UIApplication sharedApplication] delegate] performSelector:@selector(nameofMethod)];
インポートすることを忘れないでください。
#import "AppDelegate.h"
次の手順に従ってください
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
私は最初のものをお勧めします。実行してください。
NSObject <UIApplicationDelegate> * universalAppDelegate =
( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];
AppDelegate.hをどこにでも含める必要がなくなります。それは長い道のりをたどる単純なキャストであり、独立したコントローラーを開発し、クラス名などを心配することなく他の場所でそれらを再利用することを可能にします...
楽しい
良い答えがたくさん追加されています。ほとんどの場合、自分に合ったものを追加したいのですが。
#define kAppDelegate ((YourAppDelegate *)[[UIApplication sharedApplication] delegate]);
以上です。定数のように、アプリケーション全体で使用します。
例えば
[kAppDelegate methodName];
yourAppDelegate.hを対応する.pchファイルまたはマクロファイルにインポートすることを忘れないでください。
そして、watchOSのView ControllerからWatchKit拡張デリゲートにアクセスする必要がある場合:
extDelegate = WKExtension.sharedExtension().delegate as WKExtensionDelegate?
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()
}
出力:
技術的に実現可能であっても、これは良いアプローチではありません。あなたが言うとき:「スプラッシュスクリーンには、ウォークスルーの任意のポイントにジャンプできるようにする各部屋のボタンがあります。」ボタンのtohcイベントを介してこれらのコントローラーを呼び出すためにappdelegateを通過したいですか?
このアプローチはAppleのガイドラインに従っておらず、多くの欠点があります。
2020年、iOS13、xCode 11.3。Objective-Cの機能は次のとおりです。
#import "AppDelegate.h"
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
それは私のために働いています、私はあなたにも同じことを望みます!:D