【问题标题】:Subclasssing NSFont子类化 NSFont
【发布时间】:2014-03-31 15:57:52
【问题描述】:

尝试编写一些在 iOS 和 OS X 之间工作的通用库。为了不通过在代码中添加大量#if TARGET_OS_IPHONE 来使应用程序混乱,我想我可以使用一个通用的子类来继承 UIFont 和 NSFont .h 并为每个构建使用单独的 .m 文件。所以我有以下子类结构 MyFont.h 和 MyFont_iOS.m 和 MyFont_OSX.m。每个目标都包含相应的 .m 文件。在 iOS 上运行良好,但在 OSX 上执行时,我得到一个 EXC_BAD_ACCCES,用类似的行创建字体对象

MyFont *myFont = [MyFont fontWithName:@"Arial" size:132.0];

我不能继承 NSFont 吗?

这是我的 NSFont 子类的基本代码示例(请注意,此时我在子类中没有专门的代码。这只是一个基本子类)

MyFont.h

#if TARGET_OS_IPHONE
@interface MyFont : UIFont
#else
@interface MyFont : NSFont
#endif
@end

MyFont_iOS.m

#import "MyFont.h"
@implementation MyFont
@end

MyFont_OSX.m

#import "MyFont.h"
@implementation MyFont
@end

尝试使用子类字体(在 iOS 应用中 - 工作正常!)

#import "MyFont.h"
...
MyFont *myFont = [MyFont fontWithName:@"Arial" size:45.0];

尝试使用子类字体(在 OS X 应用程序中 - 崩溃!)

#import "MyFont.h"
...
MyFont *myFont = [MyFont fontWithName:@"Arial" size:132.0];

仅供参考 - 我也在这一行收到警告

使用“NSFont *”类型的表达式初始化“MyFont *”的不兼容指针类型

所以我肯定做错了什么,但只是不明白为什么它迫使我使用 NSFont 但在 UIFont 上工作正常。

感谢您的指导!

【问题讨论】:

    标签: objective-c macos nsfont


    【解决方案1】:

    fontWithName 返回 NSFont/UIFont - 已修复。 IT 不能被子类化

    即使它有效,它也不是定义的行为


    您可以做的是拥有一个包含平台特定字体的包装器

    例如

    @implementation MyFont {
        PlatformSpecificFont *_font
    }
    + (instancetype)fontWithName:... {
        _font = [PlatformSpecificFont fontWithName:...];
        return self;
    }
    

    【讨论】:

    • 感谢@Daij-Djan 花时间帮助我。这是我尝试的第一件事,并且确实弄乱了我的代码,因为我必须更改所有 UI 代码来处理新属性。例如,我必须从 textView.font = myFont 转到 textView.font = myFont.font。似乎是多余的,需要我更新大量的 UI 代码。感谢您的帮助。
    【解决方案2】:

    Wrapper 是一个很好的方法。另一种选择:根据目标,要么

    #define MyFont NSFont
    

    #define MyFont UIFont
    

    如果两者都需要不同的代码,您可以为类添加扩展。

    【讨论】:

    • FacePalm!我过度思考的经典案例。谢谢!这非常有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多