我有一个基本情况,当用户通过身份验证时,我删除当前屏幕(登录屏幕)并将其更改为应用程序内的另一个屏幕。
为此,我使用以下代码:
if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
print("Window's subviews before removed = \(appDelegate.window?.subviews)")
appDelegate.window?.subviews.forEach { $0.removeFromSuperview() }
print("Window's subviews after removed = \(appDelegate.window?.subviews)")
appDelegate.window?.rootViewController?.view?.removeFromSuperview()
appDelegate.window?.rootViewController?.removeFromParentViewController()
appDelegate.window?.rootViewController = newRootViewController
print("Window's subviews after changed = \(appDelegate.window?.subviews)")
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
但是,在 Debug View Hierarchy 工具中不行:
如您所见,旧的 rootViewController 的视图仍然存在,UIWindow但不是它的子视图 - 正如输出所示。
这种行为看起来很奇怪,有人遇到过这个问题吗?
iOS 具有以下调用方法,因此您可以通过通知中心或设置应用程序向用户提供自定义通知设置:
func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification?) {
// Open up a Settings view controller within your app or something
}
Run Code Online (Sandbox Code Playgroud)
在其中,您将打开一些应用内设置视图控制器。
在 iOS 12 上这很容易,找到活动窗口,找到 rootViewController 并将设置屏幕扔到它上面。
在 iOS 13 上你(可以)有多个窗口,所以我假设这个方法可以在其中任何一个上调用?
假设您有 5 个应用程序窗口在后台打开,然后您打开“设置”应用程序并请求应用程序的通知设置。它使用哪个窗口?我如何知道要将设置屏幕添加到哪个窗口/视图控制器?我不想随机选择一个并且不小心将它添加到背景中的一个而不是打开的那个。
UNNotificationResponse另一方面,确实有一种targetScene方法,因此如果您的应用程序是从通知中打开的,您就可以知道要使用哪个窗口,但这种方法似乎缺乏它。
我应该遍历应用程序可用的所有窗口场景并在前台找到一个吗?
我能够在 Mac Catalyst 中创建一个统一的工具栏SceneDelegate.swift:
// Use a UIHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
// hide the titlebar
windowScene.titlebar?.toolbar = NSToolbar()
windowScene.titlebar?.titleVisibility = .hidden
...
}
Run Code Online (Sandbox Code Playgroud)
但我想让工具栏像这个例子一样透明:https : //lukakerr.github.io/swift/nswindow-styles#11-transparent-toolbar-without-seperator
这在 Mac Catalyst 中甚至是可能的吗?
它看起来确实无害.在我的App Delegate中,我检查NSUserDefaults是否有标志以显示启动时的提示.如果它已设置,那么,在最后applicationDidFinishLaunching:,我这样做:
TipsViewController *vc = [[TipsViewController alloc]
initWithNibName:@“TipsView" bundle:nil];
[window addSubview:vc.view];
[vc release];
Run Code Online (Sandbox Code Playgroud)
这个想法是暂时显示这个观点.(请注意,它不是模态VC.此时没有导航控制器,而且此视图中没有导航栏.)
一旦这个视图被解除,我们将把我们先占的UITabBarController视图添加到窗口并转换到它,然后从主窗口中删除提示视图.我还没有达到解雇观点,因为,好吧,继续阅读.
我的TipsView的VC或多或少都是这样的:
UIView -> view -> File’s Owner (TipsViewController)
UIImageView -> background image
UIView -> tipView -> File’s Owner
UIImageView -> background image
UIScrollView
UILabel (tip text)
UIButton -> touch-up-inside -> -(IBAction)button1:
UIButton -> touch-up-inside -> -(IBAction)button2:
UIButton -> touch-up-inside -> -(IBAction)button3:
Run Code Online (Sandbox Code Playgroud)
源包含所有三个IBAction调用的声明和定义.现在他们两个什么都不做.第三个更改提示text,调整大小以适应,并调整滚动视图contentSize以匹配.
当我运行应用程序时,TipsViewController视图显示就好了.我甚至可以滚动提示文字.然而,当我在任何UIButton上触发内部触摸时,Xcode开始在源头(我在每个IBAction上放置一个断点)中植入我...然后用a EXC_BAD_ACCESS或者拯救 …
当我在模拟器中执行下面的代码时,我希望看到红色填满屏幕,但是它全是黑色,为什么?
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIView * myView = [[UIView alloc] initWithFrame:[window bounds]];
[myView setBackgroundColor:[UIColor redColor]];
[window addSubview:myView];
[window makeKeyAndVisible];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
如果我添加窗口的初始化,这没有帮助:
window = [[[UIWindow alloc] init] initWithFrame:[[UIScreen mainScreen] bounds]];
Run Code Online (Sandbox Code Playgroud)
在Xcode中创建基于Window的Universal项目之后我开始麻烦了我决定删除iPad/iPhone xib文件和iPhone/iPad应用程序委托文件,这些文件是在项目中自动创建的,而是有一个带有视图的应用程序委托控制器,基于设备以编程方式构建视图.现在我似乎无法显示我在app delegate中创建的简单视图.
编辑:我删除了添加视图,现在将窗口的背景颜色设置为红色.这没有用,但如果我在模拟器中转到桌面并重新打开正在运行的应用程序,我现在得到一个红色屏幕.再一次,我很困惑,为什么我第一次启动应用程序时看不到红色.
我在AppDelegate中有这个(didFinishLaunching):
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
Run Code Online (Sandbox Code Playgroud)
我尝试在相关的视图控制器中处理事件,但这很不稳定(一些视图控制器会获得事件,而其他视图控制器则不会,即使它们是第一响应者).我尝试了子类化UIApplication.那没用.现在我正在尝试子类化UIWindow并执行此操作(请参阅注释):
- (void)sendEvent:(UIEvent *)event {
if (event.type == UIEventTypeRemoteControl) {
NSLog(@"I wish this happened"); //this never happens
}
else
{
NSLog(@"some other event"); //this does happen on any other interaction
[super sendEvent:event];
}
}
- (void) remoteControlReceivedWithEvent: (UIEvent *) receivedEvent {
if (receivedEvent.type == UIEventTypeRemoteControl) {
NSLog(@"got remote event"); // this never happens either
switch (receivedEvent.subtype) {
case UIEventSubtypeRemoteControlTogglePlayPause:
{
NSLog(@"handle play/pause");
break;
}
default:
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在信息plist中尝试了有和没有这个:
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
Run Code Online (Sandbox Code Playgroud)
没有区别.正如Apple文档所述,您可以使用音频控件模拟远程控制事件(双击主页按钮并在底部滚动到它们).当我按下播放或暂停时,它只播放我的iTunes资料库中的音频.我也尝试过Apple耳机上的按钮.没有.
我想要做的就是检测遥控器上的播放/暂停按钮,并处理事件.我还需要做些什么来捕捉这些事件?
我目前正在展示一个安全代码视图控制器,它包含一个UITextField,用户应在其中输入密码.此安全代码视图控制器显示在其自己的窗口中,该窗口具有"windowLevel = UIWindowLevelAlert + 1;" 因为我想隐藏潜在的UIAlertView或其他可能已经显示的窗口.
当我在文本字段上调用resignFirstResponder方法时出现问题,似乎键盘在没有通常动画的情况下被解除.我尝试注册各种键盘通知,并检查了UIView areAnimationsEnabled属性,它返回YES.
所以,如果有人已经有这个问题,欢迎你:)
我正在显示自己的自定义提醒时,我正在向我的应用添加新的UIWindow.
在添加此UIWindow之前,我的应用程序隐藏了状态栏,但现在它可见.如何在这个新窗口中以编程方式隐藏状态栏.我已经尝试了一切,但它不起作用.
这就是我添加UIWindow的方式:
notificationWindow = [[UIWindow alloc] initWithFrame: CGRectMake(0, 0, 1.0, 1.0)];
notificationWindow.backgroundColor = [UIColor clearColor]; // your color if needed
notificationWindow.userInteractionEnabled = NO; // if needed
// IMPORTANT PART!
notificationWindow.windowLevel = UIWindowLevelAlert + 1;
notificationWindow.rootViewController = [UIViewController new];
notificationWindow.hidden = NO; // This is also important!
[notificationWindow addSubview:confettiView];
Run Code Online (Sandbox Code Playgroud) 我在xcode 6.0上创建了一个项目,我一直在ios8模拟器上运行该项目但是当我尝试在iphone5s ios7.1模拟器上运行时,UIWindow框架变为320x480 ...
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
Run Code Online (Sandbox Code Playgroud)
以上是我创建UIwindow的方法

我该怎么办?
我一直在使用这个:
UIApplication.sharedApplication().keyWindow?.rootViewController!.view.addSubview(self.customView)
Run Code Online (Sandbox Code Playgroud)
在应用程序视图层次结构中的所有视图上添加模式视图。
但这给我带来了问题。有时会按预期添加子视图,但有时不起作用。在哪种情况下,这将行不通,并且是在像UIAlertView这样的视图层次结构中添加模态视图的最佳方法是什么。