Beim 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 Data verwenden oder nicht.
Ich habe versucht, das Storyboard zu löschen und aus dem Projekt das Haupt-Storyboard zu entfernen und das Fenster von didFinishLaunching manuell 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 das jemand geschafft?
Antworten:
Sie müssen die Variablen
window
undtestNavigationController
als optional markieren :Bei Swift-Klassen müssen nicht optionale Eigenschaften während der Instanziierung initialisiert werden:
Denken Sie bei der Verwendung optionaler Variablen daran, diese zu entpacken
!
, z.quelle
AppDelegate
(es sei denn, sie hat während der Initialisierung einen Wert oder wird träge aufgelöst). Wenn Sie eine optionale Eigenschaft speichern und sicher sind , dass dies nicht dernil
Fall ist, "entpacken Sie sie mit dem!
Operator von ihrer Optionalität" .!
..white
?Alles, was Sie brauchen, um Storyboards nicht zu verwenden für
rootViewController
:1 · Wechseln
AppDelegate.swift
zu:2 · Erstellen Sie eine
ViewController
Unterklasse vonUIViewController
:3 · Wenn Sie das Projekt aus einer Xcode-Vorlage erstellt haben:
"Main storyboard file base name"
ausInfo.plist
.Main.storyboard
.Wie Sie im ersten Codeausschnitt sehen können, gefällt mir die
if let
Syntax zum Entpacken der optionalenwindow
Eigenschaft eher, anstatt implizit ein optionales zu entpacken . Hier verwende ich esif let a = a { }
so, dass das optionalea
eine nicht optionale Referenz innerhalb der gleichnamigenif
Anweisung wird -a
.Schließlich
self.
ist es nicht erforderlich, auf diewindow
Eigenschaft innerhalb der eigenen Klasse zu verweisen .quelle
if let window = window {
? Ich habe es herausgefunden! Es ist so, dass Sie nichtwindow!
jedes Mal verwenden müssen.if let a = a {}
.makeKeyAndVisible()
, um nach dem Einstellen zu seinrootViewController
. Andernfalls erhalten Sie eine Warnung darüber, wie das Fenster am Ende des Anwendungsstarts voraussichtlich einen Root-View-Controller haben wird.if let a = a { }
sieht komisch aus. Sind Sie sicher, dass es in Ordnung ist, denselben Variablennamen für die nicht optionale Referenz zu verwenden? Apple verwendet in seinen Swift-Dokumenten immer unterschiedliche Namen. Warum ist das besser alswindow!
jedes Mal zu verwenden?if let a = a { }
ist vollkommen in Ordnung. Sie können verwenden,if let anA = a { }
wenn Sie sich dadurch wohler fühlen. 2.window!
ist eine Laufzeitprüfung, da Sie eine Option explizit auspacken. Ich mag die Überprüfungen der Kompilierungszeit, die Swift uns zur Verfügung stellt. Warum also nicht?Wenn Sie Ihren viewController mit xib initialisieren möchten und den Navigationscontroller verwenden möchten. Hier ist ein Stück Code.
quelle
Versuchen Sie den folgenden Code:
quelle
Ich habe die Antwort gefunden, die nichts mit dem Xcode-Setup zu tun hat. Das Entfernen des Storyboards und der Referenz aus dem Projekt ist das Richtige. Es hatte mit der schnellen Syntax zu tun.
Der Code lautet wie folgt:
quelle
Sie können es einfach so machen:
quelle
Ich empfehle Ihnen, Controller und xib zu verwenden
MyViewController.swift
undMyViewController.xib
(Sie können über Datei-> Neu-> Datei-> Cocoa Touch-Klasse erstellen und "Auch XIB-Datei erstellen" auf true setzen, Unterklasse von UIViewController)
und
AppDelegate.swift
func application
Schreiben Sie den folgenden CodeEs sollte Arbeit sein!
quelle
Aktualisiert für Swift 3.0:
quelle
Update: Swift 5 und iOS 13:
Info.plist
Datei:SceneDelegate.swift
und ändernfunc scene
von:zu
quelle
Hier ist ein vollständiges Beispiel für einen schnellen Test für einen UINavigationController
quelle
Warum erstellen Sie nicht einfach eine leere Anwendung? Das Storyboard ist für mich nicht erstellt ...
quelle
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 mit der Schnittstelle xib neue Cocoa Touch-Klassendateien hinzu. (zB TestViewController)
Im Swift haben wir nur eine Datei, die mit der xib interagiert, dh * .swift-Datei, es gibt keine .h- und .m-Dateien.
Wir können die Steuerelemente von xib mit einer schnellen Datei wie in iOS 7 verbinden.
Im Folgenden finden Sie einige Ausschnitte für die Arbeit mit den Steuerelementen und Swift
Änderungen in der Datei AppDelegate.swift
Codebeispiel 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-language-and -arbeit-mit-steuern /
quelle
In iOS 13 und höher, wenn Sie ein neues Projekt ohne Storyboard erstellen, gehen Sie wie folgt vor:
Erstellen Sie ein Projekt mit Xcode 11 oder höher
Löschen Sie die Storyboard-Feder und die Klasse
Neue neue Datei mit xib hinzufügen
Die Stammansicht muss als UINavigationController SceneDelegate festgelegt werden
Fügen Sie den folgenden Code hinzu: func scene (_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {// Verwenden Sie diese Methode, um das UIWindow optional zu konfigurieren und an
window
das bereitgestellte UIWindowScene anzuhängenscene
. // Wenn Sie ein Storyboard verwenden, wird diewindow
Eigenschaft automatisch initialisiert und an die Szene angehängt. // Dieser Delegat bedeutet nicht, dass die Verbindungsszene oder Sitzung neu ist (sieheapplication:configurationForConnectingSceneSession
stattdessen). // Wache let _ = (Szene als? UIWindowScene) else {return}wenn let windowScene = szene als? UIWindowScene {self.window = UIWindow (windowScene: windowScene) let mainController = HomeViewController () als HomeViewController let navigationController = UINavigationController (rootViewController: mainController) self.window! .RootViewController!
quelle