251

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

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

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

4

13 に答える 13

541

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

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

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

次に、他のView Controllerのプロパティがあれば、次のように呼び出すことができます:

[appDelegate.viewController someMethod];
于 2011-02-22T19:29:26.520 に答える
44

そして、誰かが でこれを行う方法を知りたい場合swift:

if let myDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
   myDelegate.someMethod()
}
于 2014-10-17T03:59:33.990 に答える
41

UINavigationControllerセットアップが必要なようですね。

AppDelegateプログラムのどこからでも取得できます

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

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

コードでは、「家の概要」ビューコントローラーを既に作成していると仮定すると、次のようになります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];

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

于 2011-02-22T19:33:34.067 に答える
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

私は最初のものをお勧めします。ランアンドゴー。

于 2014-07-19T15:46:21.267 に答える
11
NSObject <UIApplicationDelegate> * universalAppDelegate = 
    ( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];

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

楽しみ

于 2012-02-05T21:36:39.793 に答える
8

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

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

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

例えば

[kAppDelegate methodName];

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

于 2014-12-10T10:27:05.667 に答える
7

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

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

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

于 2015-07-22T13:33:38.380 に答える
6

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()
}

出力:

ここに画像の説明を入力

于 2017-11-05T05:01:49.637 に答える
5

また、watchOS のビュー コントローラーから WatchKit 拡張デリゲートにアクセスする必要がある場合は、次のようにします。

extDelegate = WKExtension.sharedExtension().delegate as WKExtensionDelegate?
于 2015-09-03T20:56:12.777 に答える
0

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

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

于 2018-02-06T09:57:45.407 に答える