11

Storyboard ImageКак с данными непосредственно перейти из одной вкладки на другую вкладку правильно

У меня есть контроллер Tab Bar, который является Initial View Controller, который также имеет PFLoginViewController что ПУПС, если пользователь не вошел в систему. Поток входа/регистрации работает нормально.

две вкладки 1. UICollectionView, которые я буду ссылаться как IntroVC теперь 2. а UITableView, которые я буду ссылаться как FeedVC

Когда пользователь нажимает фотографию в IntroVC, шоу segue запускается (через prepareForSegue), который показывает третий экран (UIView), который технически не является вкладкой. С этого момента я буду ссылаться на это как SelectVC.

ПРИМЕЧАНИЕ. Все эти экраны также вставляются (деблокированы) в навигационном контроллере.

В SelectVC отображает фото, и есть UIButton, что пользователь может нажать кнопку, которая запускает шоу SEGUE и Расслабиться SEGUE, нажать изображение в FeedVC. Причина, по которой я создал Unwind segue, состоит в том, что без нее изображение будет нажимать на FeedVC (вторая вкладка), но первая вкладка будет выделена.

Я установил это с помощью Unwind segue, но я заметил, что у меня проблема, когда после выбора, когда я нажимаю 1-ю вкладку (Intro VC), панель Nav имеет кнопку «Назад», и чем больше раз я использую кнопку SelectVC, чтобы нажимать изображения, чем больше раз я должен нажать Назад в IntroVC. Я очень смущен тем, как это исправить. Очевидно, что я не правильно подключаю поток, и кажется, что IntroVC генерируется несколько раз?

я получаю следующее сообщение в консоли, когда я иду через перетекает в симуляторе:

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. 

Любая помощь будет принята с благодарностью!

Соответствующий код ниже.

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) 
     }) 
    } 
} 

Я знаю, что это причудливо структурирован, и если я пропускаю информацию, которая необходима для полного понимания - пожалуйста, дайте мне знать, и Я отредактирую соответственно.

ответ

0

Я думаю, ваша проблема возникает в этой строке (prepareForSegue метод)

self.navigationController?.popViewControllerAnimated(true) 

, так как вы пытаетесь вытолкнуть контроллер представления из стека до представления SelectVC. Это может быть причиной возможной поврежденной навигационной панели (что, если вы используете контроллер корневого представления?). Вы можете попробовать следующий метод вместо:

self.navigationController?.popToRootViewControllerAnimated(true) 
+0

hey @flizana, я попробовал ваше предложение, но это не сработало. Спасибо, что пытались помочь! – SamYoungNY

+0

Вы пытались поставить точки останова в каждом методе, который вызывается, чтобы проверить, какая строка выбрасывает исключение? – flizana

0

я не уверен, я понимаю причину вы называете self.navigationController?.popViewControllerAnimated(true) внутри prepareForSegue: от IntroVC.swift: таким образом вы «вытаскиваете» ViewController из стека даже перед его представлением (это означает, что вы фактически пытаетесь вывести IntroVC из стека, а не SelectVC).

Первое, что я попробую, прокомментирую эту строку в файле prepareForSegue и посмотрим, что произойдет.

Я не могу попробовать прямо сейчас, но я не удивлюсь, если при вызове self.performSegueWithIdentifier("unwindToVenueView", sender: self) в SelectVC.swift автоматически будет запускаться поп себя, без необходимости называть его вручную. Если это не так, вы можете добавить popViewControllerAnimated (или, возможно, popToRootViewControllerAnimated), чтобы нажать Select: SelectVC.swift.

Дайте мне знать, если это работает!

Иметь хороший день,

@ cdf1982

+0

Привет @ cdf1982 спасибо за ваш совет. Я пробовал ваши предложения, но, к сожалению, они не работали. Мне чего-то не хватает, но я не могу понять, что. Еще раз спасибо за ваше время! – SamYoungNY

+0

Не упоминайте об этом. Последнее предложение: попробуйте прокомментировать self.tabBarController! .selectedIndex = 1 в методе разматывания: при регистрации в журнале ошибка регистрируется в непредвиденном состоянии. Возможно, это слишком быстро меняет VC, и даже если это не так, вы, вероятно, захотите добавить контрольные точки к своему коду и последовательно выполнять выполнение, чтобы понять, что подсказывает эти две ошибки. Удачи! – cdf1982

1

Segue на другую вкладку с данными

Это решение использует разматывания SEGUE для переключения на новую вкладку и отправить его данные.

enter image description here

  • зеленый Tab 1
  • Синий является потомком Tab 1
  • Желтый Tab 2

Цель: Переход от синего до желтого и передавать данные на в то же время.

Код

Blue View Controller (Таб 1, потомок)

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 
     } 
    } 
} 

Желтый View Controller (вкладка 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 
    } 
} 

Interface Builder

Перетащите элемент управления с кнопки на значок «Выход» в верхней части исходного контроллера просмотра. Поскольку мы уже добавили код разматывания segue в контроллер View View, он появится как опция. Выберите его.

enter image description here

Примечания
  • Благодарности к this answer для установки меня на правильном пути.
  • Вы также можете установить режим разматывания путем перетаскивания элемента управления с помощью значка «Выход» на значок «Вид контроллера». Затем вы можете вызвать программный вызов segue. См. this answer.
  • Для контроллера отображения Tab 1 не было специального кода.