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

时间:2011-04-22 22:50:06

标签: ios methods uiapplicationdelegate accessor mainwindow

如前所述 - 我是第一个订单的Objective-C新手,但已经阅读了4本关于这个主题的实用书籍和一堆电子书和文档,我仍然无法找到我正在寻找的东西。

我有一个顶级内容视图控制器,它想要从应用程序委托的window属性的物理维度配置其view属性。这是几个人已经问过的问题。 ([UIScreen mainScreen]并未因为此论坛上已播出多次的原因而删除它。因此,逻辑方法是内容视图控制器读取应用程序委托窗口的框架。现在,我发现接下来的唯一答案就是使用[[[UIApplication sharedApplication] window] frame] - 但是,只有在窗口属性变为keyAndVisible后才能使用。内容视图控制器需要在获取makeKeyAndVisible之前读取应用委托的窗口属性。代码按此顺序排列....

App Delegate:

- (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,但我在实例名称之后。我想通过类似的内容替换对[[UIApplication sharedApplication] keyWindow]的调用;

[myAppDelegatesInstanceName window].

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

就像我说的那样,我对所有这些都是一个完全的菜鸟,这可能是另一个愚蠢的noobie问题,但它似乎没有人以简单的方式回答。

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

如果有人可以提供帮助,我会非常感激。这个东西绝对不直观! V.V。

3 个答案:

答案 0 :(得分:21)

您可以通过单例UIApplication实例访问应用代理:

[[[UIApplication sharedApplication] delegate] window];

这是一种特殊情况,因为您可以访问一个对象({1}}实例),该对象的知道代理是您要访问的对象。一般情况:

  

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

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

答案 1 :(得分:3)

将此用于 Swift

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

答案 2 :(得分:2)

Swift 3

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