委托]窗口]和 .keyWindow之间的区别?
你好我是新手在iPhone开发任何一个可以帮助我知道以下两行之间的区别:
第一:
[[[[UIApplication sharedApplication] delegate] window] addSubview:UIView];
第二:
[[UIApplication sharedApplication].keyWindow addSubview:UIView];
提前致谢。
它们在iOS中是相同的,但是在Mac OS上它们可以是不同的,因为在iOS中只有一个窗口,而在Mac OS上可能不止一个。
从文档:
– [[[UIApplication sharedApplication] delegate] window];
展示故事板时使用的窗口。 此属性包含用于在设备的主屏幕上呈现应用程序的可视内容的窗口。
即这是您的appDelegate.h
文件中的属性window
- 为
[[UIApplication sharedApplication] keyWindow];
此属性在最近发送makeKeyAndVisible消息的Windows数组中保存UIWindow对象。
在iOS中,您在您的makeKeyAndVisible
里面发送了makeKeyAndVisible
application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
window
,这是我们上面的,所以他们是一样的。 (如果您正在使用故事板,则会自动完成)
对于大多数用途,它们将是相同的…但不总是。
[UIApplication sharedApplication].keyWindow
是当前在设备上显示的窗口。 这通常是您的应用程序的窗口,但可能是一个系统窗口。
[UIApplication sharedApplication].delegate.window
是您的应用程序预期使用的窗口。
哪一个应该使用? 那么这一切都取决于上下文。
如果你正在更新你的应用程序的一部分,那么你应该添加视图到你的应用程序的窗口。 这几乎总是你想要做的。
就我个人而言,当我需要直接添加视图到窗口时,我总是使用[[UIApplication sharedApplication].delegate.window addSubview:view]
或[self.view.window addSubView:view]
(在UIViewController
)。
无论窗口是属于您的应用程序还是某个系统窗口,您可能有时需要显示当前正在显示的窗口的视图。 我没有遇到这种情况。
Basheer_CAD的答案是不正确的。 它们在iOS中并不总是一样的。
杰弗里·托马斯的答案是对的,让我提供一个具体的例子。
- (void)viewDidLoad { [super viewDidLoad]; NSLog(@"keyWindow --------> %@",[UIApplication sharedApplication].keyWindow.rootViewController); NSLog(@"delegate.window --> %@",[UIApplication sharedApplication].delegate.window.rootViewController); NSLog(@"self.view.window -> %@",self.view.window.rootViewController); } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"title" message:@"message" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:nil]; [alert show]; NSLog(@"keyWindow --------> %@",[UIApplication sharedApplication].keyWindow.rootViewController); NSLog(@"delegate.window --> %@",[UIApplication sharedApplication].delegate.window.rootViewController); NSLog(@"self.view.window -> %@",self.view.window.rootViewController); }
输出是:
keyWindow --------> (null) delegate.window --> <ViewController: 0x10030c0e0> self.view.window -> (null) keyWindow --------> <UIApplicationRotationFollowingController: 0x100204510> delegate.window --> <ViewController: 0x10030c0e0> self.view.window -> <ViewController: 0x10030c0e0>
当viewDidLoad
,实际上窗口还没有准备好,所以没有什么系统窗口。 UIAlertView
可能主宰窗口,所以你不能得到你想要的窗口。
最简单的设置是只有一个UIWindow
。 通常,该窗口将作为应用程序委托的属性保留。 keyWindow
是指定接收键盘和其他非触摸相关事件的键盘keyWindow
。 一次只有一个窗口可能是关键窗口。 所以,如果你添加第二个窗口,并使其成为keyWindow
(通过[window makeKeyAndVisible]
),你的线返回不同的窗口!