1

我在从 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
)

)}'。

有人通过 XPC 服务成功传输了 NSAttributtedText 吗?

4

1 回答 1

0

编辑:我在 devforums 上收到了对我的消息的回复,解决方法是使用 NSSet 并在传递给 setClasses() 时将其转换为 Set。另一个问题是所有选择器都已经有预设的类,因此您需要将自己的类添加到当前的类中,而不是只设置您自己的类。这是一个工作代码:

        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, ])

返回一个 Set<NSArray>,这不是你想要的。我假设您添加了“arrayLiteral”参数标签,因为编译器告诉了您,但是这会编译:

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

它返回一个 Set<String>。

问题是我找不到创建一组类类型的方法。我在 Apple 的 devforums 上问过:https ://devforums.apple.com/thread/271316但除非我遗漏了一些明显的东西,否则这看起来像是一个 API 错误。

于 2015-05-20T21:38:45.850 回答