2016-04-28 13 views
1

Ich versuche, den Alarm Controller-Klasse in schnellenVersuch, deren Ansicht zu präsentieren, ist nicht in der Fensterhierarchie

//AppDelegate.swift: 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     // Override point for customization after application launch. 

     window = UIWindow(frame:UIScreen.mainScreen().bounds) 

     let loginVC = ViewControllerForLogin (nibName:"ViewControllerForLogin", bundle:nil) 

     navigationObject = UINavigationController(rootViewController: loginVC) 

     window?.rootViewController = loginVC 

     window?.makeKeyAndVisible() 
     return true 
    } 

//SPSwiftAlert.swift 

class SPSwiftAlert: UIViewController { 

    //#MARK: - Members 

    internal var defaultTextForNormalAlertButton = "OK" 

    static let sharedObject = SPSwiftAlert() 

    //#MARK: Functions 

    func showNormalAlert(controller: UIViewController, title: String, message: String) { 

     // create the alert 
     let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert) 

     // add an action (button) 
     alert.addAction(UIAlertAction(title: defaultTextForNormalAlertButton, style: UIAlertActionStyle.Default, handler: nil)) 

     // show the alert 
     controller.presentViewController(alert, animated: true, completion: nil) 

    }  
} 

die obige Klasse verwendet wird Anzeige versehen mit Meldung der Warnung zu erstellen und Titel mit Einzel Taste as-

SPSwiftAlert.sharedObject.showNormalAlert(self, title: "Invalid input", message: "Entered email address is not valid") 

aber mir Laufzeitfehler geben als

Attempt to present <UIAlertController: 0x7f8c805e8e80> on <Swaft_Login_Demo.ViewControllerForLogin: 0x7f8c8042d4b0> whose view is not in the window hierarchy! 

Wie soll ich das lösen?

+0

Möchten Sie den View-Controller von einem bereits präsentierten View-Controller präsentieren? SPSwiftAlert ist es schon vorgestellt. – Hasya

+0

Nein, alles steht vor dir! –

Antwort

2

Also, wenn ich den Code habe ich nicht den Teil verstehen, wo Sie Ihre loginVC statt der Navigation setzen window.rootViewController ..

window?.rootViewController = navigationObject 

Dann scheint es Sie nicht in der Ansichtshierarchie Fenster sind wenn Sie Ihre Warnung aufrufen.

Versuchen Sie, diesen Aufruf an die viewDidAppear: Methode zu schreiben.

override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 
     dispatch_async(dispatch_get_main_queue()) { 
       SPSwiftAlert.sharedObject.showNormalAlert(self, title: "Invalid input", message: "Entered email address is not valid") 
     } 
} 

HINWEIS: Dies geschieht in der Regel, wenn wir versuchen zu zeigen (present/push) der Ansicht Controller über einen anderen View-Controller, aber der Moderator-View-Controller ist zur Zeit nicht aktiv View-Controller (bedeutet, dass die Moderator Ansicht Controller Ansicht muss Draufsicht sein auf dem Bildschirm)

+0

Nein, immer noch denselben Fehler! –

+0

Code aktualisiert. Jetzt versuchen .. –

+0

Ich versuche zu verstehen, aber es ist nicht klar, wo Sie showNormalAlert, in welcher Controller .. –

0
  1. Zuerst warum sind Sie nicht pres Enthalten des Alert-Controllers auf Ihrem View-Controller selbst, anstatt einen neuen View-Controller zu erstellen und self (Ihren Viewcontroller) zu übergeben, damit der Alarm angezeigt wird.
  2. In Bezug auf das Problem haben Sie noch nie die Ansicht "SPSwiftAlert" zu einer Ansicht hinzugefügt.

// fügen Sie eine Aktion (Button) alert.addAction (UIAlertAction (Titel: defaultTextForNormalAlertButton, style: UIAlertActionStyle.Default, Handler: nil))

// hinzufügen Ansicht // selbst hinzufügen. Ansicht Subview controller.view

zeigen // die Warnung self.presentViewController (Alarm, animiert: true, Fertigstellung: nil)

+0

danke für deine Antwort, aber das Problem war mit Root-Controller. –

0

ich denke, Ihr ViewControllerForLogin präsentiert bereits oder wird nicht mit Überleitung im Storyboard.