如何从另一个对象访问我的应用程序委托的窗口访问器方法?

正如前面提到的 – 我是一个Objective-C的第一顺序的新手,但已经阅读了4本关于这个主题的实体书籍,还有一堆电子书和文档,我仍然无法find我要找的东西。

我有一个顶级内容视图控制器,想要从应用程序委托的窗口属性的物理维度来configuration其视图属性。 这是几个人已经提出的问题。 ( [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方法我有以下testing代码…

 - (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 Class实例的名称是什么? 我知道应用程序委托的名默认为myApplicationNameAppDelegate但我在实例名称之后。 我想通过类似的东西来replace对[[UIApplication sharedApplication] keyWindow]的调用;

 [myAppDelegatesInstanceName window]. 

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

就像我说的那样,我对这一切都是一无所知的,这可能是另一个愚蠢的noobie问题,但这是一个没有人看起来用简单的方式回答的问题。

(程序上 – 我的家园 – 有很多方法可以将窗口的东西放到其他层面的范围内,从使窗口全局可访问到整个程序集到通过各种function层次结构传递给特定的参数 – 但是这个目标似乎偏离了既定的程序实践)。

如果有人能帮忙,我会很感激。 这东西绝对不是直觉! VV

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

 [[[UIApplication sharedApplication] delegate] window]; 

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

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

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

使用这个Swift

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

Swift 3

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