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

Изображение для раскадровки

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

Две вкладки: 1. UICollectionView, которую я буду называть IntroVC с этого момента 2. UITableView, которую я буду называть FeedVC

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

ПРИМЕЧАНИЕ. Все эти экраны также встроены в навигационный контроллер.

SelectVC отображает фотографию, и есть UIButton, которую пользователь может нажать, что вызывает переходы «Показать» и «Отменить», чтобы поместить изображение в FeedVC. Причина, по которой я создал переход Unwind, заключается в том, что без него изображение будет помещаться в FeedVC (2-я вкладка), но первая вкладка все равно будет выделена.

Я исправил это с переходом «Открутить», но заметил, что у меня возникла проблема, когда после выбора, когда я нажимаю 1-ю вкладку (Intro VC), на панели навигации появляется кнопка «Назад», и чем больше раз я использую кнопку 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]
        }
}

ВыберитеVC.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)
        })
    }
}

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


person SamYoungNY    schedule 24.04.2015    source источник


Ответы (3)


Перейти на другую вкладку с данными

В этом решении используется откат, чтобы переключиться на новую вкладку и отправить на нее данные.

введите здесь описание изображения

  • Зеленый - это вкладка 1
  • Синий является потомком Tab 1.
  • Желтый - это вкладка 2

Цель: перейти от синего к желтому и одновременно передавать данные.

Код

Контроллер Blue View (потомок вкладки 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
        }
    }
}

Желтый контроллер просмотра (вкладка 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
    }
}

Конструктор интерфейсов

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

введите здесь описание изображения

Примечания

  • Спасибо этому ответу, который поставил меня на правильный путь.
  • Вы также можете установить переход отката, перетащив элемент управления со значка «Выход» на значок «Контроллер представления». Затем вы можете вызвать переход программно. Подробности см. в этом ответе.
  • Специального кода для контроллера представления Tab 1 не было.
person Suragch    schedule 11.12.2017

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

self.navigationController?.popViewControllerAnimated(true)

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

self.navigationController?.popToRootViewControllerAnimated(true)
person flizana    schedule 01.05.2015
comment
эй @flizana, я попробовал твое предложение, но, к сожалению, это не сработало. Спасибо за попытку помочь! - person SamYoungNY; 04.05.2015
comment
Пробовали ли вы ставить точки останова в каждом вызываемом методе, чтобы проверить, какая строка вызывает исключение? - person flizana; 04.05.2015

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

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

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

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

Хорошего дня,

@cdf1982

person cdf1982    schedule 03.05.2015
comment
Привет @ cdf1982 спасибо за совет. Я попробовал ваши предложения, но, к сожалению, они не сработали. Что-то мне не хватает, но я не могу понять что. Еще раз, спасибо за ваше время! - person SamYoungNY; 04.05.2015
comment
Не упоминай об этом. Последнее предложение: попробуйте прокомментировать self.tabBarController!.selectedIndex = 1 в методе раскрутки: зарегистрированная ошибка жалуется на неожиданное состояние при завершении навигации. Возможно, это связано с тем, что раскрутка изменила VC слишком рано, и даже если это не так, вы, вероятно, захотите добавить точки останова в свой код и проследить за выполнением шаг за шагом, чтобы понять, что вызывает эти две ошибки. Удачи! - person cdf1982; 04.05.2015