2014-03-31 32 views
0

试图编写一些可在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创建字体对象,如子类化NSFont

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 

中号yFont_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]; 

仅供参考 - !我也越来越警告在此行

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

所以我肯定做错了什么,但就是不明白为什么它迫使我使用NSFont而精的作品UIFont。

感谢您的任何指导!

回答

1

包装是一个很好的方法来做到这一点。一种替代方案:根据不同的目标,无论是

#define MyFont NSFont 

#define MyFont UIFont 

在哪里都需要不同的代码,你可以扩展添加到类。

+0

FacePalm!我经常想到这个问题。谢谢!这完美的作品! –

4

fontWithName返回一个NSFont/UIFont - 已修复。它不能被继承

即使它的工作原理,它是没有定义的行为


你可以做的是有保存特定的平台字体

例如一个包装

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

感谢@ Daij-Djan抽出时间帮助我。这是我尝试的第一件事,并且真的让我的代码混乱起来,因为我必须更改所有的UI代码来处理新的属性。例如,我不得不从textView.font = myFont去textView.font = myFont.font。看起来多余,并要求我更新大量的UI代码。谢谢您的帮助。 –