La création d'un nouveau projet dans XCode 6 ne permet pas de désactiver les Storyboards. Vous pouvez uniquement sélectionner Swift ou Objective-C et utiliser ou non les données de base.
J'ai essayé de supprimer le storyboard et du projet en supprimant le storyboard principal et en réglant manuellement la fenêtre de didFinishLaunching
Dans le AppDelegate j'ai ceci:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow
var testNavigationController: UINavigationController
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
testNavigationController = UINavigationController()
var testViewController: UIViewController = UIViewController()
self.testNavigationController.pushViewController(testViewController, animated: false)
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
self.window.rootViewController = testNavigationController
self.window.backgroundColor = UIColor.whiteColor()
self.window.makeKeyAndVisible()
return true
}
}
Cependant, XCode me donne une erreur:
La classe 'AppDelegate' n'a pas d'initialiseurs
Quelqu'un a réussi dans cela?
Vous devez marquer les variables window
et testNavigationController
comme facultatives:
var window : UIWindow?
var testNavigationController : UINavigationController?
Les classes Swift nécessitent l'initialisation de propriétés non optionnelles lors de l'instanciation:
Les classes et les structures doivent définir toutes les propriétés stockées sur une valeur initiale appropriée au moment de la création d'une instance de cette classe ou de cette structure. Les propriétés stockées ne peuvent pas être laissées dans un état indéterminé.
Les propriétés de type facultatif sont automatiquement initialisées avec la valeur nil, ce qui indique que la propriété est délibérément censée n'avoir "aucune valeur pour le moment" pendant l'initialisation.
Lorsque vous utilisez des variables optionnelles, n'oubliez pas de les décompresser avec !
, telles que:
self.window!.backgroundColor = UIColor.whiteColor();
Tout ce qu'il faut pour ne pas utiliser les Storyboards pour la rootViewController
:
1 · Remplacez AppDelegate.Swift
par:
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
window = UIWindow(frame: UIScreen.main.bounds)
if let window = window {
window.backgroundColor = UIColor.white
window.rootViewController = ViewController()
window.makeKeyAndVisible()
}
return true
}
}
2 · Créez une sous-classe ViewController
de UIViewController
:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.blue
}
}
3 · Si vous avez créé le projet à partir d'un modèle Xcode:
"Main storyboard file base name"
de Info.plist
.Main.storyboard
.Comme vous pouvez le voir dans le premier extrait de code, au lieu de dérouler implicitement un optionnel, j'aime bien la syntaxe if let
pour décompresser la propriété optionnelle window
. Ici, je l'utilise comme if let a = a { }
, de sorte que l'option a
devienne une référence non facultative à l'intérieur de l'instruction if
- du même nom - a
.
Enfin, self.
n'est pas nécessaire pour référencer la propriété window
à l'intérieur de sa propre classe.
Si vous souhaitez initialiser votre viewController avec xib et que vous devez utiliser le contrôleur de navigation. Voici un morceau de code.
var window: UIWindow?
var navController:UINavigationController?
var viewController:ViewController?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
window = UIWindow(frame: UIScreen.mainScreen().bounds)
viewController = ViewController(nibName: "ViewController", bundle: nil);
navController = UINavigationController(rootViewController: viewController!);
window?.rootViewController = navController;
window?.makeKeyAndVisible()
return true
}
Essayez le code suivant:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
self.window!.backgroundColor = UIColor.whiteColor()
// Create a nav/vc pair using the custom ViewController class
let nav = UINavigationController()
let vc = NextViewController ( nibName:"NextViewController", bundle: nil)
// Push the vc onto the nav
nav.pushViewController(vc, animated: false)
// Set the window’s root view controller
self.window!.rootViewController = nav
// Present the window
self.window!.makeKeyAndVisible()
return true
}
Vous pouvez simplement le faire comme ceci:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var IndexNavigationController: UINavigationController?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
var IndexViewContoller : IndexViewController? = IndexViewController()
self.IndexNavigationController = UINavigationController(rootViewController:IndexViewContoller)
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
self.window!.rootViewController = self.IndexNavigationController
self.window!.backgroundColor = UIColor.whiteColor()
self.window!.makeKeyAndVisible()
return true
}
}
J'ai trouvé que la réponse n'avait rien à voir avec la configuration de xcode, la suppression du storyboard et la référence du projet est la bonne chose. Cela avait à voir avec la syntaxe Swift.
Le code est le suivant:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var testNavigationController: UINavigationController?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
self.testNavigationController = UINavigationController()
var testViewController: UIViewController? = UIViewController()
testViewController!.view.backgroundColor = UIColor.redColor()
self.testNavigationController!.pushViewController(testViewController, animated: false)
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
self.window!.rootViewController = testNavigationController
self.window!.backgroundColor = UIColor.whiteColor()
self.window!.makeKeyAndVisible()
return true
}
}
Mise à jour pour Swift 3.0:
window = UIWindow()
window?.rootViewController = ViewController()
window?.makeKeyAndVisible()
Je vous recommande d'utiliser controller et xib
MyViewController.Swift
et MyViewController.xib
(Vous pouvez créer via Fichier-> Nouveau-> Fichier-> Cocoa Touch Class et définir "également créer un fichier XIB" true, sous-classe de UIViewController)
class MyViewController: UIViewController {
.....
}
et dans AppDelegate.Swift
func application
écrivez le code suivant
....
var controller: MyViewController = MyViewController(nibName:"MyViewController",bundle:nil)
self.window!.rootViewController = controller
return true
Ça devrait être du travail!
Voici un exemple complet de test Swift pour un contrôleur UINavigation
import UIKit
@UIApplicationMain
class KSZAppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var testNavigationController: UINavigationController?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
// Working WITHOUT Storyboard
// see http://randexdev.com/2014/07/uicollectionview/
// see http://stackoverflow.com/questions/24046898/how-do-i-create-a-new-Swift-project-without-using-storyboards
window = UIWindow(frame: UIScreen.mainScreen().bounds)
if let win = window {
win.opaque = true
//you could create the navigation controller in the applicationDidFinishLaunching: method of your application delegate.
var testViewController: UIViewController = UIViewController()
testNavigationController = UINavigationController(rootViewController: testViewController)
win.rootViewController = testNavigationController
win.backgroundColor = UIColor.whiteColor()
win.makeKeyAndVisible()
// see corresponding Obj-C in https://developer.Apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html#//Apple_ref/doc/uid/TP40011313-CH2-SW1
// - (void)applicationDidFinishLaunching:(UIApplication *)application {
// UIViewController *myViewController = [[MyViewController alloc] init];
// navigationController = [[UINavigationController alloc]
// initWithRootViewController:myViewController];
// window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// window.rootViewController = navigationController;
// [window makeKeyAndVisible];
//}
}
return true
}
}
Pourquoi ne créez-vous pas une application vide? le storyboard n'est pas créé pour moi ...
Nous pouvons créer une application basée sur la navigation sans storyboard dans Xcode 6 (iOS 8) comme suit:
Créez une application vide en sélectionnant la langue du projet en tant que Swift.
Ajoutez de nouveaux fichiers de classe cacao touch avec l'interface xib. (par exemple, TestViewController)
Dans le Swift, un seul fichier interagit avec le fichier xib, c'est-à-dire * .Swift. Il n'y a pas de fichiers .h et .m.
Nous pouvons connecter les contrôles de xib avec le fichier Swift comme dans iOS 7.
Voici quelques extraits pour travailler avec les commandes et Swift.
//
// TestViewController.Swift
//
import UIKit
class TestViewController: UIViewController {
@IBOutlet var testBtn : UIButton
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
// Custom initialization
}
@IBAction func testActionOnBtn(sender : UIButton) {
let cancelButtonTitle = NSLocalizedString("OK", comment: "")
let alertController = UIAlertController(title: "Title", message: "Message", preferredStyle: .Alert)
// Create the action.
let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .Cancel) { action in
NSLog("The simple alert's cancel action occured.")
}
// Add the action.
alertController.addAction(cancelAction)
presentViewController(alertController, animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
Modifications dans le fichier AppDelegate.Swift
//
// AppDelegate.Swift
//
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var navigationController: UINavigationController?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
self.window!.backgroundColor = UIColor.whiteColor()
self.window!.makeKeyAndVisible()
var testController: TestViewController? = TestViewController(nibName: "TestViewController", bundle: nil)
self.navigationController = UINavigationController(rootViewController: testController)
self.window!.rootViewController = self.navigationController
return true
}
func applicationWillResignActive(application: UIApplication) {
}
func applicationDidEnterBackground(application: UIApplication) {
}
func applicationWillEnterForeground(application: UIApplication) {
}
func applicationDidBecomeActive(application: UIApplication) {
}
func applicationWillTerminate(application: UIApplication) {
}
}
Trouvez un exemple de code et d'autres informations sur http://ashishkakkad.wordpress.com/2014/06/16/create-a-application-in-xcode-6-ios-8-without-storyborard-in-Swift -language-and-work-with-controls /