提问人:TechUnRestricted 提问时间:7/23/2023 更新时间:7/23/2023 访问量:34
在“initWithCoder”中返回另一个 NSView 子类会导致错误“此编码器要求从 initWithCoder 返回替换的对象””
Returning another NSView subclass in 'initWithCoder' results in error "This coder requires that replaced objects be returned from initWithCoder""
问:
我想为我的应用程序(OS X 10.6+)制作一个向后兼容的背景视图,然后在我的Application.xib中使用它。
我创建了一个 NSView 的子类,它返回 NSVisualEffectView 或 NSView(取决于 macOS 版本)。
背景视图.h
#import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
@interface BackgroundView : NSView
@end
NS_ASSUME_NONNULL_END
背景视图.m
#import "BackgroundView.h"
@implementation BackgroundView
- (instancetype)init {
if (@available(macOS 10.10, *)) {
NSVisualEffectView *visualEffectView = [[NSVisualEffectView alloc] init];
[self applyPropertiesForVisualEffectView: visualEffectView];
}
return [super init];
}
- (instancetype)initWithCoder:(NSCoder *)coder {
if (@available(macOS 10.10, *)) {
NSVisualEffectView *visualEffectView = [[NSVisualEffectView alloc] initWithCoder:coder];
[self applyPropertiesForVisualEffectView: visualEffectView];
// !!!"This coder requires that replaced objects be returned from initWithCoder:"!!!
return (BackgroundView *)visualEffectView;
}
return [super initWithCoder:coder];
}
- (instancetype)initWithFrame:(NSRect)frameRect {
if (@available(macOS 10.10, *)) {
NSVisualEffectView *visualEffectView = [[NSVisualEffectView alloc] initWithFrame:frameRect];
[self applyPropertiesForVisualEffectView: visualEffectView];
return (BackgroundView *)visualEffectView;
}
return [super initWithFrame: frameRect];
}
- (void)applyPropertiesForVisualEffectView: (NSVisualEffectView *)visualEffectView API_AVAILABLE(macos(10.10)){
[visualEffectView setState:NSVisualEffectStateActive];
[visualEffectView setBlendingMode:NSVisualEffectBlendingModeBehindWindow];
}
@end
然后,我插入了我的 BackgroundView 类名作为窗口主视图的类。
如何解决此问题?
我不想像这里那样使用一些动态类注入,因为它在 2023 年看起来是一个糟糕的解决方案。
我知道我可以将 NSVisualEffect 添加为子视图,但我认为这不是一个好的做法。
谢谢。
答: 暂无答案
评论