2015-04-24 11 views
11

Storyboard ImageJak segue z danych z jednego do innego Tab Tab poprawnie

Mam Tab Bar kontroler, który jest początkową View Controller, który również ma PFLoginViewController że PUP w górę, jeśli użytkownik nie jest zalogowany. Proces logowania/rejestracji działa dobrze.

Obie karty są 1. UICollectionView które będę nazywać IntroVC odtąd 2. a UITableView które będę nazywać FeedVC

Gdy użytkownik kliknie zdjęcie w IntroVC, pokazu przełączenie jest wyzwalane (przez prepareForSegue), które pokazuje trzeci ekran (UIView), który technicznie nie jest zakładką. Odsyłam to teraz jako SelectVC.

UWAGA: Wszystkie te ekrany są również osadzone (ded) w kontrolerze nawigacyjnym.

W SelectVC wyświetla zdjęcia, a tam jest UIButton że użytkownik może nacisnąć który wyzwala Pokaż segue i odpoczynek segue, aby przesunąć obraz do FeedVC. Powód, dla którego utworzyłem sekcję Odwilż, polega na tym, że bez niej obraz przesunąłby się do FeedVC (druga zakładka), ale pierwsza zakładka byłaby podświetlona.

Naprawiłem to przy odpinaniu z Unwind, ale zauważyłem, że mam problem z tym, że po selekcji, po naciśnięciu pierwszej zakładki (Intro VC) pasek nawigacji ma przycisk Wstecz i im więcej razy go używam przycisk SelectVC do przesyłania zdjęć, tym więcej razy muszę nacisnąć Wróć w numerze IntroVC. Jestem bardzo zdezorientowany, jak to naprawić. Jest oczywiste, że nie podłączam poprawnie przepływu i wydaje się, że IntroVC jest generowany wiele razy?

pojawia się następujący komunikat w konsoli kiedy przejść przez segues w symulatorze:

Nested pop animation can result in corrupted navigation bar 

Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 

Każda pomoc będzie bardzo mile widziane!

Odpowiedni kod poniżej.

IntroVC.swift

@IBAction func unwindToIntroView(segue: UIStoryboardSegue) { 
    self.tabBarController!.selectedIndex = 1 


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showFeedItem" { 
     let selectScreenVC = segue.destinationViewController as! SelectScreenViewController 
     let cell = sender as! UICollectionViewCell 
     if let indexPath = self.collectionView!.indexPathForCell(cell) { 
      self.navigationController?.popViewControllerAnimated(true) 
      selectScreenVC.currentVenue = venueItems[indexPath.row] 
     } 
} 

SelectVC.swift

@IBAction func pushSelection(sender: UIButton) { 
    var feedItem = FeedItem() 
    if let currentItem = currentItem { 
     feedItem.nName = currentItem.nName 
     feedItem.imageFile = currentItem.lgImg 
     feedItem.userName = PFUser.currentUser()!.username! 
     feedItem.saveInBackgroundWithBlock({ (success: Bool, error: NSError?) -> Void in 
      self.performSegueWithIdentifier("unwindToVenueView", sender: self) 
     }) 
    } 
} 

Wiem, że to dziwnie zorganizowany, a jeśli brakuje mi informacji, które są potrzebne, aby w pełni zrozumieć - proszę dać mi znać i Odpowiednio edytuję.

Odpowiedz

0

Myślę, że problem jest w tym wierszu (prepareForSegue metody)

self.navigationController?.popViewControllerAnimated(true) 

ponieważ próbujesz pop kontroler widok od stosu przed przedstawieniem SelectVC. Może to być przyczyną możliwego uszkodzenia paska nawigacji (co jeśli wyskoczy kontroler widoku root?). Można spróbować następującej metody Zamiast:

self.navigationController?.popToRootViewControllerAnimated(true) 
+0

hej @flizana, próbowałem twojej sugestii, ale to niestety nie zadziałało. Dzięki za próbę pomocy! – SamYoungNY

+0

Czy próbowałeś wprowadzać punkty przerwania w każdej wywołanej metodzie, aby sprawdzić, która linia rzuca wyjątek? – flizana

0

Nie jestem pewien, rozumiem powody wywołaniu self.navigationController?.popViewControllerAnimated(true) wewnątrz prepareForSegue: z IntroVC.swift: w ten sposób "wyskakujesz" ViewController ze stosu jeszcze przed jego zaprezentowaniem (co oznacza, że ​​faktycznie próbujesz wyrzucić IntroVC ze stosu, a nie SelectVC).

Pierwsza rzecz, którą chciałbym wypróbować, skomentuj tę linię w prepareForSegue: i zobacz, co się stanie.

Nie mogę teraz spróbować, ale nie zdziwiłbym się, gdyby wywołanie self.performSegueWithIdentifier("unwindToVenueView", sender: self) w SelectVC.swift spowodowałoby automatyczne wywołanie samego siebie, bez konieczności wywoływania go ręcznie. Jeśli tak nie jest, możesz dodać popViewControllerAnimated (lub może popToRootViewControllerAnimated), aby pushSelection: of SelectVC.swift.

Daj mi znać, jeśli to zadziała!

Miłego dnia,

@ cdf1982

+0

Hi @ cdf1982 dzięki za porady. Próbowałem twoich sugestii, ale niestety nie zadziałały. Jest coś, czego mi brakuje, ale nie wiem, co. Jeszcze raz dziękuję za poświęcony czas! – SamYoungNY

+0

Nie wspominaj o tym. Ostatnia sugestia: spróbuj skomentować self.tabBarController! .selectedIndex = 1 w metodzie rozwijania: zarejestrowany błąd narzeka na nieoczekiwany stan po zakończeniu nawigacji. Być może zbyt szybko zmienia się VC, a nawet jeśli nie jest, prawdopodobnie chcesz dodać punkty przerwania do swojego kodu i krok po kroku śledzić wykonanie, aby zrozumieć, co powoduje wyświetlanie tych dwóch błędów. Powodzenia! – cdf1982

1

Segue na inną kartę z danymi

Rozwiązanie to wykorzystuje odwijania segue, aby przełączyć się na nowej karcie i wysłać go dane.

enter image description here

  • Zieleń to Tab 1
  • Blue jest potomkiem Tab 1
  • Żółty to Tab 2

Cel: Idź z niebieskiej na żółtą i przekazywania danych u w tym samym czasie.

Kod

Blue View Controller (Tab 1, potomek)

import UIKit 
class BlueViewController: UIViewController { 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

     // this is the data that we want to send 
     let myData = "Hello from Blue" 

     // Get a reference to the destination View Controller 
     // and set the data there. 
     if let yellowVC = segue.destination as? YellowViewController { 
      yellowVC.data = myData 
     } 
    } 
} 

Żółty View Controller (Tab 2)

import UIKit 
class YellowViewController: UIViewController { 

    var data: String? 

    @IBOutlet weak var dataLabel: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     updateUI() 
    } 

    @IBAction func comingFromBlueUnwindSegue(segue: UIStoryboardSegue) { 
     // This may get called before the UI views have been loaded if 
     // the user has not navigated to this tab before. So we need to make 
     // sure that the label has been initialized. If it hasn't then we 
     // will have our chance to call updateUI() in viewDidLoad(). 
     // We have to call it here too, though, becuase if the user has 
     // previously navigated to this tab, then viewDidLoad() won't get 
     // called again. 
     if dataLabel != nil { 
      updateUI() 
     } 
    } 

    func updateUI() { 
     // only update the label if the string data was previously set 
     guard let myString = data else {return} 
     dataLabel.text = myString 
    } 
} 

Interfejs Builder

Przeciągnij kontrolkę od przycisku do ikony Wyjdź u góry kontrolera widoku źródła. Ponieważ dodaliśmy już rozwijany kod rozdzielania do docelowego kontrolera widoku, pojawi się on jako opcja. Wybierz to.

enter image description here

Uwagi

  • Dzięki this answer ustawiania mnie na właściwe tory.
  • Możesz także ustawić rozwijanie odpadu przez przeciągnięcie kontrolki z ikony wyjścia do ikony kontrolera widoku. Potem możesz wywołać programowo programowanie. Aby uzyskać szczegółowe informacje, patrz this answer.
  • Nie było specjalnego kodu do wyświetlenia dla kontrolera widoku Tab 1.