12

前に述べたように、私は初めての Objective-C の初心者ですが、このテーマに関する物理的な本を 4 冊読み、大量の電子ブックとドキュメントを読みましたが、まだ探しているものが見つかりません。

アプリケーション デリゲートのウィンドウ プロパティの物理的なサイズからビュー プロパティを構成するトップレベルのコンテンツ ビュー コントローラーがあります。これは、すでに何人かが質問しているものです。([UIScreen mainScreen]このフォーラムですでに何度も放映された理由により、カットしません)。したがって、論理的なアプローチは、コンテンツ ビュー コントローラーがアプリケーション デリゲートのウィンドウのフレームを読み取ることです。現在、これに近い唯一の答えは使用することです[[[UIApplication sharedApplication] window] frame]-ただし、これはウィンドウプロパティがkeyAndVisibleになっている場合にのみ機能します。コンテンツ ビュー コントローラーは、makeKeyAndVisible を取得するに、アプリ デリゲートのウィンドウ プロパティを読み取る必要があります。コードはこの順序で....

アプリのデリゲート:

- (BOOL) application: (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions {
// This next line is a test window frame for R&D purposes....
    [self setWindow: [[UIWindow alloc] initWithFrame: CGRectMake(0.0f, 20.0f, 320.0f, 320.0f)]];

    if ([self window]) {
        contentViewController = [[ContentViewControl alloc] initWithNibName: nil bundle: nil]; // Content view controller instantiated here

        if (contentViewController) {
            [[self window] addSubview: [contentViewController view]];
            [[self window] layoutSubviews];
            [[self window] makeKeyAndVisible];  // Window made key and visible here
            return YES;
        }
    }

    return NO;
}

私のコンテンツ ビュー コントローラーの initWithNibName: nil bundle: nil メソッドには、次のテスト コードがあります...

- (id) initWithNibName: (NSString *) nibNameOrNil bundle: (NSBundle *) nibBundleOrNil {
    self = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil];

    if (self) {
        NSLog(@"%@", NSStringFromCGRect([[[UIApplication sharedApplication] keyWindow] frame]));
        // This does not work.
    }

    return self;
}

App Delegate のウィンドウがまだキーになっていないため、これは機能しません。ですから、私の質問はこうです。アプリ デリゲート クラスのインスタンスの名前は何ですか? App Delegateのクラス名がデフォルトであることは知っていますが、インスタンスmyApplicationNameAppDelegateの後です。への呼び出しを次のように置き換えたい。[[UIApplication sharedApplication] keyWindow]

[myAppDelegatesInstanceName window].

これを少し拡張すると、クエリを実行するオブジェクトのスコープの子孫ではない他のターゲット オブジェクトのメソッドにアクセスするにはどうすればよいでしょうか?

私が言ったように、私はこれらすべてに完全に初心者であり、これはおそらく別の愚かな初心者の質問ですが、まだ誰も簡単な方法で答えていないようです.

(手続き的に-私のホームターフ-ウィンドウを他のレベルのスコープに降ろす方法はたくさんあります-ウィンドウをプログラムスイート全体にグローバルにアクセスできるようにすることから、さまざまな関数階層を介して特定のパラメーターとして渡すことまで-しかし、この客観的なものは、確立された手続き的な慣行から逸脱しているようです)。

誰かが助けてくれれば、本当に感謝しています。このようなものは間違いなく直感的ではありません! VV

4

3 に答える 3

22

UIApplicationシングルトンインスタンスを介してアプリ デリゲートにアクセスできます。

[[[UIApplication sharedApplication] delegate] window];

UIApplicationただし、アクセスしたいオブジェクトがデリゲートであることがわかっているオブジェクト (インスタンス) にアクセスできるため、これは特殊なケースです。一般的なケース:

これを少し拡張すると、クエリを実行するオブジェクトのスコープの子孫ではない他のターゲット オブジェクトのメソッドにアクセスするにはどうすればよいでしょうか?

ターゲット オブジェクトへの参照を、アクセス元のオブジェクトに渡す必要があります。これは必要な場合もありますが、これら 2 つのオブジェクト間に密結合を導入することも意味します。これは通常、できれば避けたいものです。したがって、それぞれのケースについて考え、他に考えられるデザインがないかどうかを確認してください。

于 2011-04-22T22:54:35.633 に答える
5

スイフト3

    if let window = NSApplication.shared().windows.first {
        // access window. properties now
    }
于 2016-12-27T22:51:07.070 に答える
3

これをSwiftに使用します。

let window:UIWindow? = (UIApplication.sharedApplication().delegate?.window)!
于 2015-11-21T17:06:27.703 に答える