在 iOS 13 中,该UIWindowSceneDelegate对象不在响应者链中(我通过打印响应者链验证了这一点)。但Xcode提供的模板代码使场景委托类继承自UIResponder. 如果我使场景委托类继承自NSObject,代码仍然可以毫无问题地编译和运行。
那么让场景委托类符合 的意义何在呢UIResponder?
我在操作时遇到问题时也注意到了这一点,在与HopperNSToolbarItem进行调查后,我发现原因是虽然's是,但它没有转发到其委托的覆盖(我们的类符合),它是超类 -的下一个是下一个应用程序委托。UIWindownextResponderUIWindowScenenextResponderSceneDelegateUIWindowSceneDelegateUISceneUIApplication
我的猜测是,需要一个符合场景委托的类作为下一个响应者,应用程序在语法上是很棘手的,即使它在 ObjC 中实现,在 Swift 中也可能更难或不可能。也许苹果只是觉得不值得这么麻烦。使用 Catalyst,任何NSToolbarItem窗口场景的工具栏都可以将其目标设置为场景委托本身,而不是搜索响应者链,甚至系统项目也可以像示例toolbarWillAddItem中那样更改其目标。如果他们至少在某处记录了窗口场景委托不在响应者链中的警告,那就太好了,特别是因为正如您所说,它是.UIResponder
如果您希望它位于链中,那么我创建了一个解决方法(请参阅下面的代码)。首先创建一个 的子类UIWindowScene,其nextResponder方法返回self.delegate。其次,在场景委托中添加一个nextResponder返回的委托UIApplication.sharedApplication(它将转发给应用程序委托)。最后,在场景清单(在Info.plist)中的默认配置下添加一行,然后从下拉列表中选择类名称,然后输入子类的名称。
我认为这对于需要访问窗口的操作很有用,因为一旦操作到达应用程序委托,就很难弄清楚它来自哪个场景窗口。然而正如我所说,在这种情况下,搜索链条有什么意义呢?
MyWindowScene.h
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface MyWindowScene : UIWindowScene
@end
NS_ASSUME_NONNULL_END
Run Code Online (Sandbox Code Playgroud)
我的窗口场景.m
#import "MyWindowScene.h"
@implementation MyWindowScene
- (UIResponder *)nextResponder{
return self.delegate;
}
@end
Run Code Online (Sandbox Code Playgroud)
SceneDelegate.m
@implementation SceneDelegate
...
- (UIResponder *)nextResponder{
return UIApplication.sharedApplication;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
923 次 |
| 最近记录: |