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

| 如前所述-我是一阶的Objective-C新手,但已经阅读了4本书有关该主题的物理书籍,以及大量的电子书和文档,但我仍然找不到我想要的东西。 我有一个顶级的内容视图控制器,它希望从应用程序委托的window属性的物理维度配置其view属性。这是几个人已经提出的问题。 (
[UIScreen mainScreen]
不会因为在此论坛上已经播出过多次的原因而将其删除)。因此,逻辑方法是让内容视图控制器读取应用程序代理窗口的框架。现在,我发现与之接近的唯一答案是使用
[[[UIApplication sharedApplication] window] frame]
-但是,只有将window属性设置为keyAndVisible时,此方法才起作用。内容视图控制器需要先读取应用程序委托的window属性,然后才能使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名称默认为
myApplicationNameAppDelegate
,但是我在实例名称之后。我想用类似下面的方法代替对ѭ5的调用;
[myAppDelegatesInstanceName window].
稍微扩展一下,如何访问不是目标对象的作用域后代的其他目标对象中的方法? 就像我说的那样,我对这一切完全不屑一顾,这可能是另一个愚蠢的问题,但这是没人能以简单的方式回答的问题。 (在程序上-我的家乡-有很多方法可以将窗口内容放到其他级别的范围,从使整个程序套件都可以全局访问该窗口到通过各种功能层次结构将其作为特定参数向下传递-但这个“客观”内容似乎偏离了既定的程序性实践)。 如果有人可以提供帮助,我将非常感激。这些东西绝对不直观! V.V.     
已邀请:
您可以通过单例
UIApplication
实例访问应用程序委托:
[[[UIApplication sharedApplication] delegate] window];
但是,这是一种特殊情况,因为您可以访问其委托已知为要访问的对象的对象(“ 7”实例)。一般情况:   稍微扩展一下,如何访问不是目标对象的作用域后代的其他目标对象中的方法? 您需要将对目标对象的引用传递到您要从中访问它的对象。有时这是必需的,但这也意味着您在这两个对象之间引入了紧密的耦合,如果可以的话,通常希望避免这种耦合。因此,请考虑每种情况,看看是否还有其他可能的设计。     
迅捷3
    if let window = NSApplication.shared().windows.first {
        // access window. properties now
    }
    
将此用于Swift:
let window:UIWindow? = (UIApplication.sharedApplication().delegate?.window)!
    

要回复问题请先登录注册