tv.*_*vin 37 iphone objective-c ios
您好,我是iPhone开发的新手,任何人都可以帮助我了解以下两行之间的区别:
第一:
[UIApplication.sharedApplication.delegate.window addSubview:myView];
Run Code Online (Sandbox Code Playgroud)
第二:
[UIApplication.sharedApplication.keyWindow addSubview:myView];
Run Code Online (Sandbox Code Playgroud)
提前致谢.
Jef*_*mas 38
对于大多数用途,它们将是相同的......但并非总是如此.
[UIApplication sharedApplication].keyWindow是当前正在设备上显示的窗口.这通常是应用程序的窗口,但可能是系统窗口.
[UIApplication sharedApplication].delegate.window 是您的应用程序应该使用的窗口.
应该使用哪一个?那一切都取决于背景.
如果要更新部分应用程序,则应将视图添加到应用程序窗口.这几乎总是你想要做的.
就个人而言,当我需要直接向窗口添加视图时,我总是使用[[UIApplication sharedApplication].delegate.window addSubview:view]或[self.view.window addSubView:view](内部UIViewController).
有时您可能希望向当前显示的窗口显示视图,无论该窗口属于您的应用程序还是某个系统窗口.我没有碰到那种情况.
Bas*_*CAD 10
它们在iOS上可能是相同的.当它们不同时,通常会呈现除应用代表主窗口之外的另一个窗口.您的应用程序可以有多个窗口,但只有keyWindow窗口中可见的窗口和接收事件(例如可见UIAlert,接收事件是关键窗口)参考:https://developer.apple.com/library /content/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html
来自文档:
- 为UIApplication.sharedApplication.delegate.window
演示故事板时使用的窗口.此属性包含用于在设备主屏幕上显示应用程序可视内容的窗口.
即这是window您AppDelegate.h文件中的属性
UIApplication.sharedApplication.keyWindow 此属性将UIWindow对象保存在最近发送makeKeyAndVisible消息的windows数组中.
在iOS上你发送makeKeyAndVisible了你的AppDelegate.m内部
application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
您将创建的appDelegate窗口设为keyWindow.通常银行应用程序在应用程序放在后台时切换关键窗口,以便在主页按钮被双击时保护用户敏感信息,并在应用程序处于前台时切换回主代理窗口.
这个答案与:@SipkeSchoorstra,@ D-Mx和@andyDarwin合作
Basheer_CAD的答案不对.它们在iOS中并不总是相同的.
Jeffery Thomas的回答是正确的,让我提供一个具体的例子.
- (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);
}
Run Code Online (Sandbox Code Playgroud)
输出是:
keyWindow --------> (null)
delegate.window --> <ViewController: 0x10030c0e0>
self.view.window -> (null)
keyWindow --------> <UIApplicationRotationFollowingController: 0x100204510>
delegate.window --> <ViewController: 0x10030c0e0>
self.view.window -> <ViewController: 0x10030c0e0>
Run Code Online (Sandbox Code Playgroud)
viewDidLoad实际上,当窗口尚未就绪时,系统窗口没有任何内容.UIAlertView可能会占据窗口,所以你无法获得你想要的窗口.
| 归档时间: |
|
| 查看次数: |
21905 次 |
| 最近记录: |