2017-07-17 65 views
1

繼承我有一個從NSAttributedString繼承這樣的類:「無法識別的選擇發送到實例」 一類從NSAttributedString

Text.h:

#import <Foundation/Foundation.h> 

@interface Text : NSAttributedString 

-(id) initWithString:(NSString*) text andFont:(NSFont*)font andLineHeight:(float) lineHeight andLetterSpacing:(float) letterSpacing; 

@end 

Text.m:

#import "Text.h" 

#import <Cocoa/Cocoa.h> 

@implementation Text 

-(id) initWithString:(NSString*) text andFont:(NSFont*)font andLineHeight:(float) lineHeight andLetterSpacing:(float) letterSpacing 
{ 
    NSMutableParagraphStyle* paragraphStyle = [[NSMutableParagraphStyle alloc] init]; 
    [paragraphStyle setParagraphStyle: [NSParagraphStyle defaultParagraphStyle]]; 
    paragraphStyle.lineHeightMultiple = lineHeight; 
    NSDictionary* attributes = 
    @{ 
     NSFontAttributeName: font, 
     NSKernAttributeName: @(letterSpacing), 
     NSParagraphStyleAttributeName: paragraphStyle 
    }; 
    self = [super initWithString:text attributes:attributes]; 
    return self; 
} 

@end 

當我實例化類如下:

[[Text alloc] initWithString:@"Test" andFont:welcomeLabelFont andLineHeight:52 andLetterSpacing:0.0f]]; 

我得到以下異常:

2017-07-17 17:21:15.771610+0300 Test[41403:10128169] -[Text initWithString:attributes:]: unrecognized selector sent to instance 0x600000000f70 

選擇器可在基類中,事件CTRL點擊就跳轉到NSAttributedText類。任何人都可以指出我做錯了什麼?這些論點不是零指針,而且這個呼籲似乎是合法的。唯一奇怪的是,錯誤的類名稱爲Text而不是NSAttributedString

+5

NSAttributedString是一個類集羣,可能不是子類。你希望在這個子類中實現什麼?它可能近似於擴展名,或可能完全避免。 – danh

+0

@danh我想創建一個內部隱藏屬性字典構造的類。來自C++世界似乎很好,但現在我後悔了。什麼標誌着這個類不可推論?爲什麼我可以繼承它呢? –

+0

在這裏查看關於集羣。 (https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/ClassCluster.html)。你可以通過擴展來完成你的目標。我會在Xcode中寫一些東西來確認,並在幾處發佈。 – danh

回答

4

Instad的子類,使用擴展名。像這樣

// in NSAttributedString+init.h 
// 
@interface NSAttributedString (Init) 

-(instancetype) initWithString:(NSString*) text andFont:(NSFont*)font andLineHeight:(float) lineHeight andLetterSpacing:(float) letterSpacing; 

@end 

,然後`

// in NSAttributedString+init.m 
// 
#import "NSAttributedString+init.h" 

@implementation NSAttributedString (Init) 

-(instancetype) initWithString:(NSString*) text andFont:(NSFont*)font andLineHeight:(float) lineHeight andLetterSpacing:(float) letterSpacing { 
    // ... 
} 

導入擴展報頭,無論你想用你的方便初始化。

相關問題