web-dev-qa-db-fra.com

Comment créer un nouveau projet Swift sans utiliser Storyboards?

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?

105
EhTd

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();
70
akashivskyy

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:

  1. Supprimez la paire clé-valeur pour la clé "Main storyboard file base name" de Info.plist.
  2. Supprimez le fichier de scénario 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.

87
tobiasdm

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
}
13
Warewolf

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

}
6
PREMKUMAR

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
    }
}
2
Hilen

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
    }

}
2
EhTd

Mise à jour pour Swift 3.0:

window = UIWindow()
window?.rootViewController = ViewController()
window?.makeKeyAndVisible()
2
Tiago Martinho

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.Swiftfunc application écrivez le code suivant

....
var controller: MyViewController = MyViewController(nibName:"MyViewController",bundle:nil)
self.window!.rootViewController = controller
return true

Ça devrait être du travail!

2
Yi Feng Xie

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
          }
    }
1
Dmitry Konovalov

Pourquoi ne créez-vous pas une application vide? le storyboard n'est pas créé pour moi ...

0
allemattio

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 /

0
Ashish Kakkad