Ios 为什么默认的UIWindowSceneDelegate类继承自UIResponder?

Ios 为什么默认的UIWindowSceneDelegate类继承自UIResponder?,ios,ios13,ipados,Ios,Ios13,Ipados,在iOS 13中,UIWindowSceneDelegate对象不在响应程序链中(我通过打印响应程序链验证了这一点)。但是模板代码Xcode提供了使场景委托类继承自UIResponder。如果我使场景代理类继承自NSObject,则代码仍然可以编译并运行 那么,让场景代理类符合UIResponder有什么意义呢?我在NSToolbarItem操作出现问题时也注意到了这一点,在调查之后,我发现原因是尽管UIWindow的下一个响应者是UIWindowScene,它没有转发给其委托的nextResp

在iOS 13中,
UIWindowSceneDelegate
对象不在响应程序链中(我通过打印响应程序链验证了这一点)。但是模板代码Xcode提供了使场景委托类继承自
UIResponder
。如果我使场景代理类继承自
NSObject
,则代码仍然可以编译并运行


那么,让场景代理类符合
UIResponder
有什么意义呢?

我在
NSToolbarItem
操作出现问题时也注意到了这一点,在调查之后,我发现原因是尽管
UIWindow
的下一个响应者是
UIWindowScene
,它没有转发给其委托的
nextResponder
覆盖(我们的
SceneDelegate
类符合
UIWindowSceneDelegate
),它的超类--
UIScene
的下一个是
UIApplication
,它的下一个是app委托

我的猜测是,要求场景委托符合类作为下一个响应者,应用程序在语法上是很棘手的,即使它是在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
SceneDelegate.m

#import "MyWindowScene.h"

@implementation MyWindowScene

- (UIResponder *)nextResponder{
    return self.delegate;
}

@end
@implementation SceneDelegate
...
- (UIResponder *)nextResponder{
    return UIApplication.sharedApplication;
}

首先,它启用了基于用户活动的状态保存机制@matt UIScene也继承了UIResponder。我们可以让场景委托类从NSObject继承并使用UIScene进行状态恢复吗?