具有多个参数的函数的选择器

时间:2017-09-15 09:28:51

标签: ios swift uiapplication

我需要我的应用扩展程序才能使用参数打开我的主机应用。我是通过使用URL打开自定义UIApplication.shared来实现此目的的。

现在。我的上一次构建在测试飞行中被拒绝,并显示消息"Need test for export compliance"或类似内容(iTunes连接不希望以英语运行)。所以我认为Require only App-Extension-Safe API在我的扩展程序NO中设置为Build Settings是问题的可能原因。

将标记设置为YES会禁用UIApplication.shared。所以我决定使用我前一段时间找到的旧方式(不幸的是,无法找到记录):

// Get "UIApplication" class name through ASCII Character codes.
NSString *className = [[NSString alloc] initWithData:[NSData dataWithBytes:(unsigned char []){0x55, 0x49, 0x41, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E} length:13] encoding:NSASCIIStringEncoding];
if (NSClassFromString(className))
{
    //  A different way to call [UIApplication sharedApplication]
    id object = [NSClassFromString(className) performSelector: @selector(sharedApplication)];
    //  These lines invoke selector with 3 arguements
    SEL selector = @selector(openURL:options:completionHandler:);
    id  (*method)(id, SEL, id, id, id) = (void *)[object methodForSelector: selector];
    method(object, selector, myURL, nil, nil);
    //  Close extension
    [self.extensionContext completeRequestReturningItems: @[] completionHandler: nil];
}

如您所见,这是Objective-C,但我还需要Swifty。 所以,这就是我被困的地方:

let codes = [CUnsignedChar](arrayLiteral: 0x55, 0x49, 0x41, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E)
let className = String(data: Data(bytes: UnsafeRawPointer(codes), count: 13), encoding: String.Encoding.ascii) ?? ""
if NSClassFromString(className) != nil
{
    let object = NSClassFromString(className)?.shared()
    let sel = #selector(_:options:completionHandler:)
    let meth = object?.method(for: sel)
    ...

问题在于sel(预期表达式)。我试图在这里引用的方法是

open(_:options:completionHandler:) 

这件事

#selector(open(_:options:completionHandler:))

也不起作用(使用未解析的标识符),因为我实现此代码的视图控制器没有这样的方法。

所以问题是:如何创建一个带有一些参数的无名选择器引用,以便稍后用于我的meth对象?感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用NSSelectorFromString方法,该方法允许您使用Selector声明String个实例。

我没有完整的源代码,但只需进行一些调整,以下内容应该有效:

NSSelectorFromString("open(_:options:completionHandler:)")

有关该方法的更多文档可供here