如何从另一个对象访问我的 Application Delegate 的窗口访问器方法?

Posted

技术标签:

【中文标题】如何从另一个对象访问我的 Application Delegate 的窗口访问器方法?【英文标题】:How do I access my Application Delegate's window accessor method from another object? 【发布时间】:2011-08-11 06:33:31 【问题描述】:

如前所述 - 我是 Objective-C 的第一批新手,但已经阅读了 4 本关于该主题的实体书籍以及大量电子书和文档,但我仍然找不到我想要的东西。

我有一个***内容视图控制器,它想从应用程序委托的窗口属性的物理维度配置其视图属性。这是几个人已经问过的问题。 ([UIScreen mainScreen] 没有删减它的原因已经在这个论坛上播出过很多次了)。因此,逻辑方法是让内容视图控制器读取应用程序委托窗口的框架。现在,我发现与此接近的唯一答案是使用[[[UIApplication sharedApplication] window] frame] - 但是,这仅在将 window 属性设置为 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 Class 实例的名称是什么?我知道 App Delegate 的 Class 名称默认为 myApplicationNameAppDelegate,但我在 instance 名称之后。我想用类似的方式替换对[[UIApplication sharedApplication] keyWindow] 的调用;

[myAppDelegatesInstanceName window].

稍微扩展一下,如何访问其他目标对象中的方法,这些目标对象不是执行查询的对象的作用域后代?

就像我说的,我对这一切都是个菜鸟,这可能是另一个愚蠢的菜鸟问题,但似乎还没有人以简单的方式回答过这个问题。

(在程序上 - 我的地盘 - 有很多方法可以将窗口内容降低到其他级别的范围,从使整个程序套件可以全局访问窗口到将其作为特定参数通过各种函数层次结构——但这个客观的东西似乎背离了既定的程序实践)。

如果有人能提供帮助,我将不胜感激。这东西绝对不直观! V.V.

【问题讨论】:

【参考方案1】:

您可以通过单例UIApplication 实例访问应用委托:

[[[UIApplication sharedApplication] delegate] window];

不过,这是一种特殊情况,因为您可以访问一个对象(UIApplication 实例),您知道其委托就是您要访问的对象。一般情况:

稍微扩展一下,如何访问其他目标对象中的方法,这些目标对象不是执行查询的对象的作用域后代?

您需要将对目标对象的引用传递给要从中访问它的对象。这有时是必要的,但这也意味着您在这两个对象之间引入了紧密耦合,如果可以的话,您通常希望避免这种情况。所以考虑每个案例,看看是否还有其他可能的设计。

【讨论】:

感谢 Ole 如此迅速的反应!我试试看。 抱歉,看起来很厚,Ole,但我仍然没有得到快乐。如果我正确理解您的答案,我的构造应该如下所示:[[(NumicatorAppDelegate *) [[UIApplication sharedApplication] delegate] window] frame]。这是正确的吗? 是的。你有错误吗?您还必须#import NumicatorAppDelegate.h【参考方案2】:

斯威夫特 3

    if let window = NSApplication.shared().windows.first 
        // access window. properties now
    

【讨论】:

我想你的意思是UIApplication.shared.windows.first【参考方案3】:

将此用于 Swift

let window:UIWindow? = (UIApplication.sharedApplication().delegate?.window)!

【讨论】:

以上是关于如何从另一个对象访问我的 Application Delegate 的窗口访问器方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个片段访问片段对象

如何通过 GetComponent 从另一个游戏对象中的另一个脚本访问变量?

如何从另一个活动访问在一个活动中实例化并在其自己的线程中运行的对象?

从另一个类访问 viewController 元素

Google Maps API JS - 从另一个JS文件访问标记位置

如何从另一个类访问函数?