Nous avons un objet UIApplication personnalisé, donc notre main.Swift était
import Foundation
import UIKit
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(MobileUIApplication), NSStringFromClass(AppDelegate))
et cela n'a pas fonctionné dans Xcode 8 beta 5, nous avons donc utilisé cette
//TODO Swift 3 workaround? https://forums.developer.Apple.com/thread/46405
UIApplicationMain( Process.argc, UnsafeMutablePointer<UnsafeMutablePointer<CChar>>(Process.unsafeArgv), nil, NSStringFromClass(AppDelegate.self))
Sur Xcode 8 beta 6, nous obtenons tilisation de l'identifiant non résolu 'Processus'
Que devons-nous faire dans Xcode 8 beta 6/Swift 3 pour définir l'UIApplicationMain?
Je l'écris de cette façon:
UIApplicationMain(
CommandLine.argc,
UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(
to: UnsafeMutablePointer<Int8>.self,
capacity: Int(CommandLine.argc)),
nil,
NSStringFromClass(AppDelegate.self)
)
Pour modifier la classe UIApplication, remplacez NSStringFromClass(MobileUIApplication.self)
par nil
dans cette formulation.
Cependant, si votre seul but ici est de remplacer une sous-classe UIApplication comme instance d'application partagée, il existe un moyen plus simple: dans le Info.plist , ajoutez la clé "Classe principale" et définissez sa valeur sur le nom de chaîne de votre sous-classe UIApplication, et marquez votre déclaration de cette sous-classe avec un @objc(...)
attribut lui donnant le même nom Objective-C.
EDIT Ce problème est maintenant résolu dans Swift 4.2. CommandLine.unsafeArgv
a maintenant la signature correcte et une peut appeler UIApplicationMain
facilement:
UIApplicationMain(
CommandLine.argc, CommandLine.unsafeArgv,
nil, NSStringFromClass(AppDelegate.self)
)
Il semble que Process
a été renommé CommandLine
dans la version bêta 6.
Mais le type de CommandLine.unsafeArgv
ne correspond pas au deuxième argument de UIApplication
, vous devrez donc peut-être écrire quelque chose comme ceci:
CommandLine.unsafeArgv.withMemoryRebound(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc)) {argv in
_ = UIApplicationMain(CommandLine.argc, argv, NSStringFromClass(MobileUIApplication.self), NSStringFromClass(AppDelegate.self))
}
(MISE À JOUR) Cette incompatibilité doit être considérée comme un bogue. En règle générale, vous feriez mieux d'envoyer un rapport de bogue lorsque vous trouvez des choses "cela ne devrait pas être", comme le troisième paramètre de la bêta 5. J'espère que ce "bogue" sera bientôt corrigé.
Si vous souhaitez simplement désigner votre classe UIApplication personnalisée, pourquoi n'utilisez-vous pas Info.plist?
NSPrincipalClass | String | $(PRODUCT_MODULE_NAME).MobileUIApplication
(Affiché comme "Classe principale" dans la vue Clés/Valeurs non brutes.)
Avec ceci dans votre Info.plist, vous pouvez utiliser votre MobileUIApplication
de manière normale en utilisant @UIApplicationMain
.
(ADDITION) En-tête doc de UIApplicationMain
:
// If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no // NSPrincipalClass key specified, the UIApplication class is used. The delegate class will be instantiated using init.