Warnungen bei Start der App

SpecialFighter

Fießers Erstling
Registriert
25.04.12
Beiträge
131
Hallo zusammen,

ich habe einen NavController -> Push Verknüfung zu einem ViewController (IntroControllerPage1).
Von diesem VC -> Modal Verküpfung zu einem anderen NavController
In dem VC überprüfe ich folgendes in der func viewdidload:

Code:
if defaults.objectForKey("Intro")!=nil{
performSegueWithIdentifier("SkipIntro", sender:nil)
}


wenn != nil -> "aktiviere" die Modal Verknüpfung zum nächsten Nav Controller
wenn == nil -> zeige den VC und Weiterleitung

Funktioniert auch alles ohne Problem.
Allerdings erhalte ich folgende Warnungen die ich gerne weg hätte:

Presenting view controllers on detached view controllers is discouraged <xxx.IntroControllerPage1:0x154e0d140>.
Unbalanced calls to begin/end appearance transitions for<UINavigationController:0x154e0cd80>.

nutze ios8 swift - jemand ne Idee?
 

Wakko

Empire
Registriert
20.07.13
Beiträge
88
Pack das mal in deine viewWillAppear Funktion rein.
 

Buhmi

Osnabrücker Reinette
Registriert
21.11.09
Beiträge
977
Die Verknüpfung zwischen Nav-Controller und deinem IntroControllerPage 1 sollte, falls er der erste ViewController im Navigationstack ist, eine Root-ViewControllerverknüpfung sein. Im IntroController1 führst du direkt, nachdem der ViewController geladen wurde, den nächsten Sprung aus. Die Animation ist aber noch nicht beendet. Probier mal den Aufruf der Segue in viewDidAppear zu verlegen.
 

SpecialFighter

Fießers Erstling
Registriert
25.04.12
Beiträge
131
das mit dem viewdidappear hält zwar die Warnungen weg, allerdings ist das problem, dass IntroControllerPage1 geladen wird für wenigen Millisekunden angezeigt wird und dann das Segue ausgeführ wird - gefällt mir noch nicht wirklich.
kann man das noch optimieren?
 

Buhmi

Osnabrücker Reinette
Registriert
21.11.09
Beiträge
977
Das Anzeigen für einige Millisekunden wirst du nicht wegbekommen, wenn du weiterhin Segues und den NavigationController benutzt. Ich würde für einen solchen Fall im AppDelegate prüfen, ob das Intro angezeigt werden soll. Dort setzt du dann je nach gewünschtem ViewController den window.rootViewController auf den entsprechenden ViewController und die App startet mit dieser Ansicht. Die ViewController könntest du über das zugehörige Storyboard und instantiateViewControllerWithIdentifier laden und bei Bedarf erst noch in einen NavigationController packen. Insgesamt in etwa so:

Code:
let storyboard = UIStoryboard.init(name: 'Main', bundle: nil)
if (defaults…) {
  self.window.rootViewController = UINavigationController.init(rootViewController: storyboard.instantiateViewControllerWithIdentifier("IntroViewController"))
} else {
  self.window.rootViewController = UINavigationController.init(rootViewController: storyboard.instantiateViewControllerWithIdentifier("rootVC")
}

Bin nur leider gerade nicht 100%ig fit in Swift und kenne natürlich deine genaue Storyboard-Struktur nicht. Also sieh es eher als grobe Vorgabe ;)
 

SpecialFighter

Fießers Erstling
Registriert
25.04.12
Beiträge
131
vielen Dank für deine Hilfe :)
Habe den Code jetzt angepasst:

Code:
func applicationDidBecomeActive(application: UIApplication) {
        let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
       
        // Intro überspringen
        if defaults.objectForKey("Intro") != nil {
                        print("INTRO ÜBERSPRINGEN")
           
            self.window!.rootViewController = UINavigationController.init(rootViewController: storyboard.instantiateViewControllerWithIdentifier("NoIntrolNavController"))
        }
            // Intro anzeigen
        else {
           
            print("INTRO ANZEIGEN")
           
            self.window!.rootViewController = UINavigationController.init(rootViewController: storyboard.instantiateViewControllerWithIdentifier("IntroNavController"))
        }
    }

Allerdings bekomme ich dann folgende Fehlermeldung bei App Start:
reason: 'Pushing a navigation controller is not supported'
 

Buhmi

Osnabrücker Reinette
Registriert
21.11.09
Beiträge
977
Es sieht so aus, als würdest du als rootViewController des Windows je zwei ineinander verschachtelte NavigationController setzen. Wenn der Controller mit dem Identifier "NoIntrolNavController" bereits ein NavigationController ist, brauchst du diesen nicht noch in einen weiteren einbetten. D.h. der Part "UINavigationController.init(rootViewController:…" kann wegfallen und du setzt direkt den über storyboard.instantiateViewController… erstellten ViewController als rootViewController.

Insgesamt also so:

Code:
func applicationDidBecomeActive(application: UIApplication) {
let storyboard = UIStoryboard.init(name: "Main", bundle: nil)

// Intro überspringen
if defaults.objectForKey("Intro") != nil {
print("INTRO ÜBERSPRINGEN")

self.window!.rootViewController = storyboard.instantiateViewControllerWithIdentifier("NoIntrolNavController")
}
// Intro anzeigen
else {

print("INTRO ANZEIGEN")

self.window!.rootViewController = storyboard.instantiateViewControllerWithIdentifier("IntroNavController")
}
}