Jak programowo ustawić InitialViewController
scenorys? Chcę otworzyć scenorys w innym widoku, w zależności od pewnych warunków, które mogą się różnić od uruchomienia do uruchomienia.
252
Jak programowo ustawić InitialViewController
scenorys? Chcę otworzyć scenorys w innym widoku, w zależności od pewnych warunków, które mogą się różnić od uruchomienia do uruchomienia.
Odpowiedzi:
Jak to zrobić bez fikcyjnego kontrolera widoku początkowego
Upewnij się, że wszystkie początkowe kontrolery widoku mają identyfikator Storyboard.
W scenorysie usuń zaznaczenie atrybutu „Jest początkowy kontroler widoku” z pierwszego kontrolera widoku.
Jeśli w tym momencie uruchomisz aplikację, przeczytasz:
Zauważysz, że Twoja właściwość okna w delegacie aplikacji jest teraz zerowa.
W ustawieniach aplikacji przejdź do celu i
Info
karty. Tam wyczyść wartośćMain storyboard file base name
. NaGeneral
karcie wyczyść wartość dlaMain Interface
. Spowoduje to usunięcie ostrzeżenia.Utwórz okno i żądany kontroler widoku początkowego w
application:didFinishLaunchingWithOptions:
metodzie delegata aplikacji :źródło
didFinishLaunchingWithOptions
jest wywoływany, gdy aplikacja jest uruchamiana w nowym procesie. Jeśli przejdziesz do ekranu głównego i wrócisz do aplikacji, ta metoda nie zostanie ponownie wywołana. (O ile iOS nie zakończy się z powodu ograniczeń pamięci.) Spróbuj zatrzymać aplikację i uruchomić ją ponownie z IDE. Jeśli problem będzie się powtarzał, opublikuj problem na SO, a chętnie pomogę, przyjacielu.self.window = UIWindow(frame: UIScreen.mainScreen().bounds) var storyboard = UIStoryboard(name: "Main", bundle: nil) var viewController: UIViewController = // self.window!.rootViewController = viewController self.window!.makeKeyAndVisible()
Dla wszystkich miłośników Swift , oto odpowiedź @Travis przetłumaczona na SWIFT :
Zrób to, co @Travis wyjaśnił przed kodem Celu C. Następnie,
ExampleViewController
Będzie nowy kontroler początkowy widok chcesz pokazać.Wyjaśnione kroki:
Miłego i szczęśliwego programowania!
źródło
Możesz programowo ustawić rootViewController okna klucza w
(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
na przykład:
źródło
init()
/deinit()
, ale bez wykonywaniaviewDidLoad()
lub właściwej inicjalizacjiIBOutlet
-s. Upewnij się, że kod jest na to gotowy.Swift 3: Zaktualizuj kod @ victor-sigler
źródło
Możesz ustawić Nawigację rootviewcontroller jako główny kontroler widoku. Ten pomysł może zostać użyty do automatycznego logowania zgodnie z wymaganiami aplikacji.
Dla użytkowników StoryboardSegue
Dzięki
źródło
Otwórz tablicę główną, wybierz widok, który chcesz zacząć, a następnie otwórz Narzędzia -> Atrybuty. Pod „View Controller” zobaczysz przycisk radiowy „Is initial View Controller”. Po prostu wybierz.
--- Na zmienione pytanie:
Możesz spróbować: napisz metodę w sekcji ViewDidLoad swojego początkowego widoku, a gdy metoda uruchomi się podczas uruchamiania aplikacji, metoda wyzwoli przejście do innego widoku.
źródło
SWIFT 5
Jeśli nie masz ustawionego ViewController jako początkowego ViewController w serii ujęć, musisz zrobić 2 rzeczy:
Na koniec możesz teraz dodać swój kod w SceneDelegate:
źródło
Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set
ostrzeżenie, które otrzymałem po tym, jak zdecydowałem się utworzyć początkową VC w kodzie. Ważny punkt, gdy @ rs7 mówi „usuń pole nazwy scenorysu”, oznaczają cały wiersz listy, a nie tylko zawartość samego pola.Nie sądzę, żeby to było możliwe. Zamiast tego możesz mieć jeden kontroler początkowy, który będzie miał sekwensy do różnych kontrolerów widoku. Podczas uruchamiania możesz zdecydować, który segment wykonać programowo.
źródło
Można ustawić
initial view controller
za pomocą Konstruktora interfejsów, a także programowo.Poniżej przedstawiono podejście zastosowane programowo.
Cel C :
Szybki:
źródło
Stworzyłem klasę routingu do obsługi dynamicznej nawigacji i utrzymania klasy AppDelegate, mam nadzieję, że pomoże to również innym.
A w AppDelegate nazwij to
źródło
Inne rozwiązanie z użyciem Swift 3 i Swift 4 z unikaniem rzucania siłą jest takie
A poniżej używa z
UINavigationController
źródło
W
AppDelegate.swift
możesz dodać następujący kod:Oczywiście musisz zaimplementować swoją logikę, na podstawie których kryteriów wybierzesz odpowiedni kontroler widoku.
Nie zapomnij również dodać tożsamości (wybierz scenorys -> Scena kontrolera -> Pokaż inspektora tożsamości -> przypisz StorboardID).
źródło
ZAKTUALIZOWANA ODPOWIEDŹ na iOS 13 i delegata sceny:
upewnij się, że w pliku info.plist przejdziesz do aplikacji Scene Manifest -> Konfiguracja sceny -> Rola sesji aplikacji -> Pozycja 0 i tam również usuń odniesienie do głównej scenorysu. W przeciwnym razie pojawi się to samo ostrzeżenie o niepowodzeniu tworzenia scenariusza.
Przenieś także kod z aplikacji delegowanej do sceny metody delegowania scen (_: willConnectTo: options :), ponieważ teraz tutaj obsługiwane są zdarzenia cyklu życia.
źródło
Kilka dni temu spotkałem się z tą samą sytuacją. Bardzo prosta sztuczka rozwiązała ten problem. Przed uruchomieniem2 ustawiłem ukryty mój początkowy kontroler widoku. Jeśli kontroler widoku początkowego jest właściwym kontrolerem, ustawiony jest jako widoczny w viewDidLoad. W przeciwnym razie wykonywany jest segment do pożądanego kontrolera widoku. Działa idealnie w iOS 6.1 i nowszych. Jestem pewien, że działa na wcześniejszych wersjach iOS.
źródło
Dzięki zmodyfikował to w AppDelegate w następujący sposób:
źródło
Znaleziono proste rozwiązanie - nie trzeba usuwać „początkowej kontroli kontrolera widoku” z serii ujęć i edycji karty Informacje o projekcie i używać
makeKeyAndVisible
, wystarczy umieścićw
źródło
rootVC
odinstantiateViewControllerWithIdentifier
, prawda?Innym sposobem jest prezentacja viewController,
Najpierw musisz utworzyć obiekt swojej serii ujęć, a następnie zmienić root (jeśli jest to wymagane), a następnie odwołać się do konkretnego kontrolera widoku, który jest wypychany bieżącego kontrolera widoku (jeśli zmienisz root), w przeciwnym razie jest to tylko nowy kontroler widoku
źródło
Swift 4, Xcode 9
w pliku AppDelegate.swift
źródło
źródło
Swift 5 lub nowszy # tworzy kontroler widoku trasy według tego prostego kodu. Jeśli używasz xcode 11 lub
var window: UIWindow?
nowszego, najpierw zainicjuj w AppDelegateźródło
Jeśli nie chcesz zmieniać applicationDidFinish, możesz wykonać następującą sztuczkę:
Ustaw kontroler nawigacji jako początkowy kontroler widoku i przypisz mu niestandardową klasę „MyNavigationController”. Następnie możesz dostosować jego kontroler widoku głównego podczas viewDidLoad - zastąpi on kontroler widoku głównego ustawiony w twojej serii ujęć.
źródło
Wybierz kontroler widoku, który chcesz najpierw otworzyć, i przejdź do inspektora atrybutów. Przejdź do sceny początkowej i sprawdź, czy jest opcja kontrolera widoku początkowego.
Teraz będzie to twój początkowy kontroler widoku, który otworzy się pierwszy po uruchomieniu aplikacji.
źródło