目标c - 亚类化NSFont



尝试编写一些在iOS和OS X之间工作的通用库。 为了不通过在代码中放入大量 #if TARGET_OS_IPHONE 来使应用程序混乱,我想我将能够使用通用的 .h 对 UIFont 和 NSFont 进行子类化,并且只需为每个构建使用单独的 .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 子类的基本代码示例(请注意,截至目前,我在子类中没有专门的代码。这只是一个基本的子类)

我的字体

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

MyFont_iOS.米

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

MyFont_OSX.米

#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 上运行良好。

感谢您的任何指导!

fontWithName 返回 NSFont/UIFont - fixed。它不能被子类化

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


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

例如

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

包装器是执行此操作的好方法。另一种选择:根据目标,要么

#define MyFont NSFont

#define MyFont UIFont

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

相关内容

  • 没有找到相关文章

最新更新