在“initWithCoder”中返回另一个 NSView 子类会导致错误“此编码器要求从 initWithCoder 返回替换的对象””

Returning another NSView subclass in 'initWithCoder' results in error "This coder requires that replaced objects be returned from initWithCoder""

提问人:TechUnRestricted 提问时间:7/23/2023 更新时间:7/23/2023 访问量:34

问:

我想为我的应用程序(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 类名作为窗口主视图的类。My XIB main view Custom Class

然后勾选“在运行时更喜欢编码器”:Ticked off option "Prefers coder at runtime"

但无论出于何种原因,我都收到此错误。This coder requires that replaced objects be returned from initWithCoder:

如何解决此问题?
我不想像这里那样使用一些动态类注入,因为它在 2023 年看起来是一个糟糕的解决方案。
我知道我可以将 NSVisualEffect 添加为子视图,但我认为这不是一个好的做法。

谢谢。

Objective-C macOS Cocoa nsView NSViageEffectView

评论


答: 暂无答案