2016-05-16 5 views
1

So habe ich einen Übergang von ViewController zu SecondViewController. Dieser Übergang wird durch eine UIButton in ViewController ausgelöst und zeigt SecondViewController modal an. Der Segue-Identifier ist gesetzt ("SegueIdentifier") und ich kann das Segment programmatisch von meinem ViewController aus aufrufen.Kann nicht per Identifikator von AppDelegate segmentieren

Wenn ich versuche, das gleiche in meinem AppDelegate zu tun, erhalte ich den Fehler, dass der Compiler einen Übergang mit dem Identifier, den ich gesetzt habe, nicht finden kann.

let viewController = ViewController()    
viewController.performSegueWithIdentifier("SegueIdentifier", sender: nil) 

Noch einmal, ich buchstäblich kopiert und den performSegueWithIdentifier Methodenaufruf aus dem oben erwähnten Verfahren in Viewcontroller eingefügt, in dem ich und es funktioniert auch performSegueWithIdentifier für die gleiche segue nennen.

Irgendwelche Ideen?

+0

dies Ihre erste ist eine Ansicht, die Sie versuchen zu drücken? –

+0

@GurPreet_Singh Nein, die Ansicht, die ich versuche zu pushen, ist nicht die ursprüngliche Ansicht. – Jonas

+0

Da Sie Ihre ViewController-Instanz mit einem einfachen Initialisierer erstellen, ist sie keinem Storyboard zugeordnet.Sie sollten von Ihrem Hauptfenster aus auf Ihrer Shard-UIApplication-Instanz auf die Root-Ansichtssteuerung zugreifen. – Paulw11

Antwort

1

In meinem ein Projekt, das ich diese Situation leite wie,

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
// Override point for customization after application launch. 

NSString *identifier; 
BOOL isSaved = [[NSUserDefaults standardUserDefaults] boolForKey:@"loginSaved"]; 
if (isSaved) 
{ 
    [email protected]"home1"; 



} 
else 
{ 
    [email protected]"dis1"; 
} 
UIStoryboard * storyboardobj=[UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
UIViewController *screen = [storyboardobj instantiateViewControllerWithIdentifier:identifier]; 



[self.window setRootViewController:screen]; 


return YES; 
} 

Es ist in Objective-C und nur als Referenz. Wenn es Ihnen helfen kann :)

Update:

In swift etwas wie

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 



    var identifier: String = String() 

    let isSaved = NSUserDefaults.standardUserDefaults().boolForKey("loginsaved") 


    if isSaved 

    { 
     identifier = "home1" 
    } 
    else{ 

     identifier = "dis1" 
    } 

    let storyboardobj: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
    let screen: UIViewController = storyboardobj.instantiateViewControllerWithIdentifier(identifier) 
    self.window!.rootViewController = screen 

    // Override point for customization after application launch. 
    return true 
} 

Hope this helfen :)

1

Wenn Sie nicht versuchen, Ihre ursprüngliche Ansicht zu zeigen, dann wie folgt tun:

UIApplication.sharedApplication().keyWindow?.rootViewController.performSegueWithIdentifier("SegueIdentifier", sender: nil) 

Und es hängt auch, dass Sie Ihren RootViewController gesetzt segue. Bitte überprüfen Sie dies auch, bevor Sie dies tun.

+0

Funktioniert das noch, wenn ich keinen rootViewController habe? – Jonas

+0

Jede Anwendung muss einen Root-View-Controller haben. Ihre Anwendung wird ohne Root-Ansicht nicht funktionieren. –

+0

Ok danke! Ich werde es später ausprobieren. – Jonas

1

Segue-Verbindung hat einige Informationen wie Quell-Controller, Ziel-Controller. Wenn Sie also die performSegue-Methode von der ViewController-Klasse aufrufen, wird sie funktionieren, da diese Klasse die Informationen dieser Segue-Verbindung enthält. Während Sie die gleiche Segue-Methode von App Delegate aufrufen, wird es nicht funktionieren. Da die App-Delegate-Klasse keine Informationen oder Definitionen zu diesem Segue-Objekt enthält.

Sie sollten auch überprüfen, ob das aufrufende Objekt unter Navigation Controller oder nicht kommt.

0

Ein Storyboard-Segment muss an den spezifischen viewController gebunden sein, von dem Sie versuchen, zu segmentieren. Sie müssen also eine Instanz des aktuellen View-Controllers auf dem Bildschirm haben. Sie können die Methode UIApplication.sharedApplication().keyWindow?.rootViewController

den Zugriff auf die RootViewController im Fenster zu bekommen, aber wenn Sie einen View-Controller über dem RootViewController präsentiert und Sie möchten die Segue auf der präsentierten View-Controller Sie die rootViewController.presentedViewController zugreifen erfüllen haben. Und da Sie mehrere presentedViewControllers haben kann, was Sie tun, ist dies:

//get the root view controller 
var currentViewController = UIApplication.sharedApplication().keyWindow?.rootViewController 
//loop over the presented view controllers and until you get the top view controller 
while currentViewController.presentedViewController != nil{ 
    currentViewController = currentViewController.presentedViewController 
} 
//And finally 
currentViewController.performSegueWithIdentifier("identifier", sender: nil) 
Verwandte Themen