2017-09-15 4 views
0

Ich brauche meine App-Erweiterung, um meine Host-App mit einem Parameter zu öffnen. Ich mache das, indem ich eine benutzerdefinierte URL mit UIApplication.shared öffne.Selektor für eine Funktion mit mehreren Parametern

Jetzt. Mein letzter Build wurde im Testflug mit einer Nachricht "Need test for export compliance" oder so ähnlich abgelehnt (iTunes connect möchte nicht auf Englisch laufen). Also ich denke, dass Require only App-Extension-Safe API auf NO in meiner Extension Build Settings ist ein möglicher Grund für das Problem.

Das Setzen des Flags auf YES deaktiviert die Verwendung von UIApplication.shared. Also habe ich beschlossen, die alte Art und Weise zu verwenden, die ich hier vor einiger Zeit gefunden (leider nicht den Datensatz finden):

// 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]; 
} 

Wie Sie sehen können, ist dies Objective-C, aber ich brauche es auch zu machen Swifty. Also hier ist, wo ich bin stecken:

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) 
    ... 

Das Problem mit sel (erwarteten Ausdruck) ist. Die Methode, die ich hier zu verweisen versuche ist

open(_:options:completionHandler:) 

Das Ding

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

nicht entweder (Verwendung von ungelösten Identifier), da die View-Controller funktioniert ich diesen Code bin der Umsetzung in keine solche Methode hat.

Also die Frage ist: Wie erstelle ich eine namenlose Selektor Referenz mit ein paar Parametern, um später mit meinem meth Objekt zu verwenden? Vielen Dank.

+0

... Ich glaube nicht, Meth ist ein guter Name für eine Variable. – the4kman

+0

@ the4kman Ich werde den Text später umstrukturieren. Die Namen der Variablen spielen keine Rolle, wenn der Code nicht funktioniert. –

Antwort

1

Sie können die NSSelectorFromString-Methode verwenden, mit der Sie Selector Instanzen mit einem String deklarieren können.

Ich habe nicht den vollständigen Quellcode aber mit ein paar Anpassungen sollten folgende Arbeiten:

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

Weitere Dokumentation über die Methode here zur Verfügung steht.

+0

Danke. Ich habe jetzt ein anderes Problem: 'NSClassFromString (className) ?. shared()' gibt mir ein unerwünschtes Klassenobjekt, da 'UIApplication' keine Methode' shared() 'hat, sondern eine Klassenvariable' shared'. Vielleicht wissen Sie, wie man auf die Variable einer unbekannten Klasse zugreifen kann? –

+0

Wie wäre es mit 'let object = (NSClassFromString (className) als' UIApplication)?. Shared() '? – jbouaziz

+0

'Statischer Member 'shared' kann nicht für Instanz vom Typ 'UIApplication'' verwendet werden –

Verwandte Themen