Tworzenie nowego projektu w XCode 6 nie pozwala na wyłączenie scenorysów. Możesz wybrać tylko Swift lub Objective-C i użyć lub nie Core Data.
Próbowałem usunąć scenorys iz projektu usuwając główny scenorys i ręcznie ustawiając okno z didFinish Uruchamianie
W AppDelegate mam to:
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
}
}
Jednak XCode daje mi błąd:
Klasa „AppDelegate” nie ma inicjatorów
Czy komuś się to udało?
Odpowiedzi:
Musisz oznaczyć zmienne
window
itestNavigationController
jako opcjonalne:Klasy Swift wymagają, aby podczas tworzenia instancji zostały zainicjowane właściwości, które nie są opcjonalne:
Korzystając ze zmiennych opcjonalnych, pamiętaj, aby je rozpakować
!
, takimi jak:źródło
AppDelegate
(chyba że ma ona wartość podczas inicjalizacji lub zostanie rozwiązana leniwie). Jeśli przechowujesz opcjonalną właściwość i masz pewność, że tak nie jestnil
, „rozpakuj ją z jej opcjonalności” za pomocą!
operatora.!
..white
?Wszystko, czego potrzeba, aby nie używać scenorysów do
rootViewController
:1 · Zmień
AppDelegate.swift
na:2 · Utwórz
ViewController
podklasęUIViewController
:3 · Jeśli utworzyłeś projekt z szablonu Xcode:
"Main storyboard file base name"
zInfo.plist
.Main.storyboard
.Jak widać w pierwszym fragmencie kodu, zamiast niejawnie rozpakowywać opcjonalne, wolę
if let
składnię rozpakowywania opcjonalnejwindow
właściwości. Tutaj używam goif let a = a { }
tak, aby opcjonalnea
stało się nieopcjonalnym odniesieniem wewnątrzif
nieopcjonalnym -statement o tej samej nazwie -a
.Wreszcie
self.
nie jest konieczne, gdy odwołujemy się dowindow
właściwości wewnątrz własnej klasy.źródło
if let window = window {
? Rozgryzłem to! Dzięki temu nie musisz go używać zawindow!
każdym razem.if let a = a {}
.makeKeyAndVisible()
bycia po ustawieniurootViewController
. W przeciwnym razie otrzymasz ostrzeżenie o tym, jak oczekuje się, że okno będzie miało główny kontroler widoku pod koniec uruchamiania aplikacji.if let a = a { }
wygląda dziwnie. Czy na pewno można użyć tej samej nazwy zmiennej dla nieopcjonalnego odwołania? Apple zawsze używa różnych nazw w swoich dokumentach Swift. Dlaczego jest to lepsze niż zwykłe używanie zawindow!
każdym razem?if let a = a { }
jest całkowicie w porządku. Możesz użyć,if let anA = a { }
jeśli poczujesz się bardziej komfortowo. 2.window!
jest sprawdzaniem w czasie wykonywania, ponieważ jawnie rozpakowujesz opcjonalny. Podoba mi się sprawdzanie czasu kompilacji, które zapewnia nam Swift, więc dlaczego go nie użyć.Jeśli chcesz zainicjować swój viewController za pomocą xib i i potrzebujesz użyć kontrolera nawigacji. Oto fragment kodu.
źródło
Wypróbuj następujący kod:
źródło
Znalazłem odpowiedź, że nie ma to nic wspólnego z konfiguracją xcode, usunięcie scenorysu i odniesienia z projektu jest właściwe. Miało to związek z szybką składnią.
Kod jest następujący:
źródło
Możesz to zrobić w ten sposób:
źródło
Zalecam użycie kontrolera i XIB
MyViewController.swift
iMyViewController.xib
(Możesz utworzyć za pomocą File-> New-> File-> Cocoa Touch Class i ustawić „także utwórz plik XIB” true, podklasę UIViewController)
i
AppDelegate.swift
func application
napisz następujący kodPowinno pracować!
źródło
Zaktualizowano dla Swift 3.0:
źródło
Aktualizacja: Swift 5 i iOS 13:
Info.plist
pliku:SceneDelegate.swift
i zmieńfunc scene
z:do
źródło
Oto przykład pełnego szybkiego testu dla kontrolera UINavigationController
źródło
Dlaczego po prostu nie utworzysz pustej aplikacji? scenorys nie jest dla mnie stworzony ...
źródło
Możemy stworzyć aplikację nawigacyjną bez scenorysu w Xcode 6 (iOS 8) w następujący sposób:
Utwórz pustą aplikację, wybierając język projektu jako Swift.
Dodaj nowe pliki klas dotykowych cocoa z interfejsem xib. (np. TestViewController)
W szybkim mamy tylko jeden plik wchodzący w interakcję z xib, tj. Plik * .swift, nie ma plików .h i .m.
Sterowanie xib możemy połączyć z plikiem swift takim samym, jak w iOS 7.
Poniżej znajduje się kilka fragmentów do pracy z kontrolkami i Swift
Zmiany w pliku AppDelegate.swift
Znajdź przykład kodu i inne informacje na http://ashishkakkad.wordpress.com/2014/06/16/create-a-application-in-xcode-6-ios-8-without-storyborard-in-swift-language-and -praca-z-sterowaniem /
źródło
W systemie iOS 13 i nowszych podczas tworzenia nowego projektu bez scenorysu użyj poniższych kroków:
Utwórz projekt za pomocą Xcode 11 lub nowszego
Usuń końcówkę i klasę scenorysu
Dodaj nowy plik za pomocą xib
Należy ustawić widok główny jako UINavigationController SceneDelegate
dodaj poniżej kod func scene (_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {// Użyj tej metody, aby opcjonalnie skonfigurować i dołączyć UIWindow
window
do podanego UIWindowScenescene
. // Jeśli używasz scenorysu,window
właściwość zostanie automatycznie zainicjowana i dołączona do sceny. // Ten delegat nie oznacza, że łącząca scena lub sesja są nowe (patrzapplication:configurationForConnectingSceneSession
zamiast tego). // straż niech _ = (scena jako? UIWindowScene) else {return}jeśli niech windowScene = scena jako? UIWindowScene {self.window = UIWindow (windowScene: windowScene) let mainController = HomeViewController () as HomeViewController let navigationController = UINavigationController (rootViewController: mainController) self.window! .RootViewController = navigationContrible.
źródło