2015-05-12 2 views
1

У меня есть огромная проблема для передачи NSAttributtedString в обратном вызове блока из службы XPC.Служба XPC, возвращающая NSAttributtedString

Я пытаюсь вернуть основную строку как:

NSDictionary *arrayComa = @{NSForegroundColorAttributeName:[NSColor colorWithRGB:0xD35250], 
          NSFontAttributeName:[NSFont fontWithName:@"Monaco" size:11]}; 

NSMutableAttributedString *testString = [[NSMutableAttributedString alloc] initWithString:@"{}" attributes:arrayComa]; 

Я также белый список входящий ответ, как:

let incommingClasses:Set = Set(arrayLiteral: [NSMutableAttributedString.self, NSAttributedString.self, NSColor.self, NSFont.self, NSString.self, ]) 
connectionService.remoteObjectInterface?.setClasses(incommingClasses, forSelector: attributtedText:withReply:, argumentIndex: 0, ofReply: true) 

Что я когда-либо я получаю ошибки:

Exception caught during decoding of received reply to message  'Exception caught during decoding of received reply to message 'attributtedText:withReply':, dropping incoming message and calling failure block. 

Exception: Exception while decoding argument 0 (#1 of invocation): 
<NSInvocation: 0x6000006649c0> 
return value: {v} void 
target: {@?} 0x0 (block) 
argument 1: {@"NSMutableAttributedString"} 0x0  

Exception: value for key '<no key>' was of unexpected class 'NSMutableAttributedString'. Allowed classes are '{(
    (
    NSMutableAttributedString, 
    NSAttributedString, 
    NSColor, 
    NSFont, 
    NSString 
) 

)} '.

Кто-нибудь передал NSAttributtedText через службу XPC успешно?

ответ

0

EDIT: Я получил ответ на свое сообщение о devforums, обходным путем является использование NSSet и его передача как Set при передаче в setClasses(). Еще одна проблема заключается в том, что уже есть предварительно заданные классы для всех селекторов, поэтому вам нужно добавить свои собственные к текущим, а не устанавливать только свои. Вот рабочий код:

 let interface = NSXPCInterface(withProtocol: MyProtocol.self) 

    let expectedClasses = NSSet.setWithArray([[NSMutableAttributedString.self, NSAttributedString.self, NSColor.self, NSFont.self]) 
    let currentExpectedClasses = interface.classesForSelector("attributtedText:withReply:", argumentIndex: 0, ofReply: false) as NSSet 

    let allClasses = currentExpectedClasses.setByAddingSet(expectedClasses) 

    interface.setClasses(allClasses as Set<NSObject>, forSelector: "attributtedText:withReply:", argumentIndex: 0, ofReply: false) 

Оригинальный ответ:

Это будет только частичный ответ, как я не нашел правильный способ сделать это либо еще, но

let incommingClasses:Set = Set(arrayLiteral: [NSMutableAttributedString.self, NSAttributedString.self, NSColor.self, NSFont.self, NSString.self, ]) 

возвращается a Набор <NSArray>, который не то, что вы хотите. Я предполагаю, что вы добавили в «arrayLiteral» ярлык аргумент, потому что компилятор сказал вам это, однако это составляет:

let foo = Set(["string1", "string2"]) 

и возвращает набор < строку >.

Проблема в том, что я не смог найти способ создания набора типов классов. Я спросил у devforums от Apple: https://devforums.apple.com/thread/271316, но если я не упустил что-то очевидное, это выглядит как ошибка API.

Смежные вопросы