web-dev-qa-db-de.com

Wie erstelle ich ein neues Swift Projekt ohne Storyboards?

Durch das Erstellen eines neuen Projekts in XCode 6 können Storyboards nicht deaktiviert werden. Sie können nur Swift oder Objective-C auswählen und Core-Daten verwenden oder nicht.

Ich habe versucht, das Storyboard zu löschen und aus dem Projekt das Haupt-Storyboard zu entfernen und das Fenster manuell in didFinishLaunching festzulegen

Im AppDelegate habe ich folgendes:

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

XCode gibt mir jedoch einen Fehler:

Die Klasse 'AppDelegate' hat keine Initialisierer

Hat jemand das geschafft?

105
EhTd

Sie müssen die Variablen window und testNavigationController als optional markieren:

var window : UIWindow?
var testNavigationController : UINavigationController?

Für schnelle Klassen müssen nicht optionale Eigenschaften während der Instanziierung initialisiert werden:

Klassen und Strukturen müssen alle ihre gespeicherten Eigenschaften auf einen geeigneten Anfangswert setzen, wenn eine Instanz dieser Klasse oder Struktur erstellt wird. Gespeicherte Eigenschaften können nicht in einem unbestimmten Zustand belassen werden.

Eigenschaften des optionalen Typs werden automatisch mit dem Wert Null initialisiert, was darauf hinweist, dass die Eigenschaft während der Initialisierung absichtlich „noch keinen Wert“ haben soll.

Denken Sie bei Verwendung optionaler Variablen daran, diese mit ! Zu entpacken, z.

self.window!.backgroundColor = UIColor.whiteColor();
70
akashivskyy

Alles was es braucht, um Storyboards nicht für das rootViewController zu verwenden:

1 · Ändern AppDelegate.Swift an:

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 · Erstelle eine ViewController Unterklasse von UIViewController:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.blue
    }
}

3 · Wenn Sie das Projekt aus einer Xcode-Vorlage erstellt haben:

  1. Entfernen Sie das Schlüssel-Wert-Paar für Schlüssel "Main storyboard file base name" von Info.plist.
  2. Löschen Sie die Storyboard-Datei Main.storyboard.

Wie Sie im ersten Codefragment sehen können, gefällt mir das if let Syntax zum Auspacken der optionalen Eigenschaft window. Hier benutze ich es wie if let a = a { }, so dass das optionale a eine nicht optionale Referenz innerhalb der if- Anweisung mit dem gleichen Namen - a wird.

Endlich self. ist nicht erforderlich, wenn auf die Eigenschaft window in der eigenen Klasse verwiesen wird.

87
tobiasdm

Wenn Sie Ihren viewController mit xib initialisieren möchten und den Navigationscontroller verwenden möchten. Hier ist ein Stück 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

Versuchen Sie den folgenden Code:

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

Sie können es einfach so machen:

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

Ich habe die Antwort gefunden, die nichts mit dem Einrichten von Xcode zu tun hat. Das Entfernen des Storyboards und der Referenz aus dem Projekt ist das Richtige. Es hatte mit der Swift Syntax zu tun.

Der Code lautet wie folgt:

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

Aktualisiert für Swift 3.0:

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

Ich empfehle dir controller und xib zu verwenden

MyViewController.Swift und MyViewController.xib

(Sie können über Datei-> Neu-> Datei-> Cocoa Touch-Klasse erstellen und festlegen, dass "auch XIB-Datei erstellen" true ist, Unterklasse von UIViewController.)

class MyViewController: UIViewController {
   .....    
}

und in AppDelegate.Swiftfunc application schreibe den folgenden Code

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

Es sollte Arbeit sein!

2
Yi Feng Xie

Hier ist ein vollständiges Swift Testbeispiel für einen UINavigationController

        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

Warum erstellen Sie nicht einfach eine leere Anwendung? das storyboard ist für mich nicht angelegt ...

0
allemattio

Wir können eine navigationsbasierte Anwendung ohne Storyboard in Xcode 6 (iOS 8) wie folgt erstellen:

  • Erstellen Sie eine leere Anwendung, indem Sie die Projektsprache als Swift auswählen.

  • Fügen Sie neue Cocoa Touch-Klassendateien mit der Schnittstelle xib hinzu. (zB TestViewController)

  • In der Swift wir haben nur eine Datei mit der xib interagieren, d. H. * .Swift-Datei, gibt es keine .h und .m-Dateien.

  • Wir können die Steuerelemente von xib mit Swift file wie in iOS 7 verbinden.

Im Folgenden finden Sie einige Ausschnitte für die Arbeit mit den Steuerelementen und 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()
    }

}

Änderungen in der AppDelegate.Swift-Datei

//
//  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) {
    }

}

Codebeispiele und andere Informationen finden Sie unter http://ashishkakkad.wordpress.com/2014/06/16/create-a-application-in-xcode-6-ios-8-without-storyborard-in-Swift -Sprache-und-Arbeit-mit-Steuerelementen /

0
Ashish Kakkad