2015-01-28 11 views
6

Buona giornata ragazzi, sto imparando Swift, ho bisogno di aiuto qui.Swift popToViewController

L'utente si sta registrando e ha selezionato la propria immagine. Al termine del selettore di immagini, desidero visualizzare ComposeViewController.

Ecco il codice:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: NSDictionary!) { 
    let pickedImage:UIImage = info.objectForKey(UIImagePickerControllerOriginalImage) as UIImage 

    //Scale Down Image 
    let scaledImage = self.scaleImageWith(pickedImage, and: CGSizeMake(100,100)) 

    let imageData = UIImagePNGRepresentation(scaledImage) 

    let imageFile:PFFile = PFFile(data: imageData) 

    PFUser.currentUser().setObject(imageFile, forKey: "profileImage") 
    PFUser.currentUser().saveInBackgroundWithTarget(nil, selector: nil) 

    picker.dismissViewControllerAnimated(true, completion: nil) 

    //this is the line seems to have problem. 
    self.navigationController?.popToViewController(ComposeViewController, animated: true) 
} 

Poi ho avuto questi errori: ComposeViewController.Type 'non è convertibile in' UIViewController Previsto nome utente o chiamata al costruttore dopo il nome di tipo

Ha suggerimento per risolvere mettendo() dopo ComposeViewController ma poi emette più errori dopo il fixing.

Spero che qualcuno possa aiutare. Grazie! :-)

+1

Benvenuti a SO !: Ma che cosa è esattamente la tua domanda/problema? Hai ricevuto un messaggio di errore? ComposeViewController non viene visualizzato? (Modifica la tua domanda e aggiungi questa informazione) –

+0

Grazie Frank! Ne prenderò nota la prossima volta. :-) – bobster

risposta

0

controller di navigazione mantiene la pila di visualizzazioni che si sta spingendo. È come un ultimo in prima fila.

Per accedere a ComposeViewController, tale vista deve già esistere nella coda e si dovrebbe avere riferimento ad essa.

È necessario passare l'istanza di ComposeViewController. per semplicità è possibile salvare tale riferimento in appdelegate. (questo approccio non è raccomandato)

2

Ho finito per sostituire il seguente codice all'interno della vista principale e funziona. Non sono sicuro se questo è il modo giusto, ti dispiacerebbe darmi qualche commento?

//self.navigationController?.popToViewController(ComposeViewController, animated: true)  
let switchViewController = self.storyboard?.instantiateViewControllerWithIdentifier("view2") as ComposeViewController 

    self.navigationController?.pushViewController(switchViewController, animated: true) 

Ho definito "view2" come ID dello storyboard di destinazione.

4

C'è un metodo che consente di ottenere l'accesso a un array di tutti i ViewControllers nello stack corrente, e si può catturare quello che si desidera utilizzando il suo indice, per esempio:

let switchViewController = self.navigationController?.viewControllers[1] as! ComposeViewController 

self.navigationController?.popToViewController(switchViewController, animated: true) 
1
if let composeViewController = self.navigationController?.viewControllers[1] { 
      self.navigationController?.popToViewController(composeViewController, animated: true) 
} 
0
for (var i = 0; i < self.navigationController?.viewControllers.count; i++) 
{ 
    if(self.navigationController?.viewControllers[i].isKindOfClass(DestinationViewController) == true) 
    { 
     self.navigationController?.popToViewController(self.navigationController!.viewControllers[i] as! DestinationViewController, animated: true) 

    break; 
    } 
} 
4

So che questo è vecchio, ma è come quello che ha detto Saqib, non è possibile accedere a un controller di visualizzazione che non esiste ancora.

Molte delle risposte qui sembrano essere da persone che non hanno letto la tua domanda, solo il titolo. Lascerò questo codice qui nel caso in cui aiuti qualcuno.

let vcIndex = self.navigationController?.viewControllers.indexOf({ (viewController) -> Bool in 

    if let _ = viewController as? ComposeViewController { 
     return true 
    } 
    return false 
}) 

let composeVC = self.navigationController?.viewControllers[vcIndex!] as! ComposeViewController 

self.navigationController?.popToViewController(composeVC, animated: true) 
-1
let controllers = self.navigationController?.viewControllers 
       for vc in controllers! { 
       if vc is YourVC { 
        _ = self.navigationController?.popToViewController(vc as! YourVC, animated: true) 
       } 
      }