0

http://pixs.ru/showimage/Snimokekra_4555441_13580029.png

Ребята, помогите передать словарь (NSDictionary) из одного сториборда в другой.

За первый вид отвечает класс PlacesCollectionViewController, за второй MenuViewController, а за таб бар контроллер (который в между ними) отвечает класс CustomTabBarController.

Как я понял, напрямую из PlacesCollectionViewController в MenuViewController данные передать невозможно.

Сейчас передаю из PlacesCollectionViewController (который 1) в CustomTabBarController, и все работает, только потом не имею знаний вытащить эти данные для класса MenuViewController (который 2).

Помогите, если не сложно.

Пишу на swift, но код на ObjC тоже разберу.

Загвоздка в том, что, указывая в методе prepareForSeque (подготовка перехода), что получателем (destinationViewController) будет MenuViewController (который 2), я не получаю ошибок, я получаю вылет компилятора и переход на строчку, которую мой мозг не может интерпретировать - 0x10bb415ed: movq %r14, %rax

3
  • Можете передать данные напрямую и презентовать контроллер модально, как вариант, это делается за пару минут и будет очень просто. Но сейчас у вас тут явная проблема с дизайном ветки экранов, выход есть, но это не будет просто, если вы хотите, чтобы второй экран показывался в UITabBarController.
    – iFreeman
    26 авг 2014 в 20:10
  • Как вариант, вы можете сделать экран членом UITabBarController, но скрыть для него UITabBar, тогда будет эффект отдельного экрана, но вы сможете легко показать нужный экран с данными и все это внутри UITabBarController.
    – iFreeman
    26 авг 2014 в 20:13
  • Вы правы, и такой вариант уже был реализован, но ведь так теряется логика самого приложения и костылем это не хочу назвать. По первому вашему комменту прошу подкинуть немного кода, совсем чуть-чуть )) Просто мыслей на данный момент - nil
    – bodpad
    26 авг 2014 в 20:26

1 ответ 1

1

Вот, например:

class PlacesCollectionViewController : UICollectionViewController, UITabBarControllerDelegate {

     override func prepareForSegue(segue, sender: AnyObject!) {
           if let identifier = segue.identifier {
                switch identifier {
                     case "GoTabController":
                          if let tabVC = segue.destinationViewController as? UITabBarController {
                                tabVC.delegate = self
                          }
                     default: println("unhandled segue \(identifier)")
                }
           }
     }

      func tabBarController(tabBarController: UITabBarController!, didSelectViewController viewController: UIViewController!) {
              if let indexPath = collectionView.indexPathForSelectedRow() {
                 if let nav = viewController as? UINavigationController {
                    if let vc = nav.viewControllers.first as? MenuViewController {
                      vc.data = items[indexPath.item]
                    }
                 }
              }
    }

}

Не уверен, нужно ли PlacesCollectionViewController продолжать быть делегатом и дальше, возможно, и нет, можете его переприсвоить, например, или занилить.

Вы можете передать данные в CustomTabBarController в prepareForSegue, сделать CustomTabBarController делегатов самого себя и, используя тот же метод делегата, что я описал выше, реализовать передачу словарика в нужный MenuViewController.

3
  • iFreeman разрешите задать еще одни вопрос, возможно ответ на него разрешит мою проблему. Предположим я передал словарь в TabBarController и в методе viewDidLoad этого класса я могу этим словарем оперировать Данные есть и теперь TabBarController показывает мой MenuViewController(который 2) тобишь вью первого таба Теперь как мне в методе viewDidLoad класса MenuViewController(который 2 он же первый таб) обратиться к данным TabBarController который их только что получил.
    – bodpad
    26 авг 2014 в 21:10
  • Получается, если в prepareForSegue я не могу передать данные напрямую в MenuViewController (который 2), ТОГДА данные точно могу передать в TabBarController и уже (ворзможно) в первом контроллере первой вьюшки табБара эти данные получить.
    – bodpad
    26 авг 2014 в 21:10
  • @bodpad, MenuViewController не должен сам ничего доставать ниоткуда, вы должно положить данные в него, я же описал выход из положения, с помощью метода делегата didSelectViewController вы получаете UIViewController, который сейчас будет показать в UITabBarController, соответственно проверяете его (по индексе или по принадлежности к классу, как я описал в примере) и передаете туда данные какие хотите. После этого во viewDidLoad MenuViewController вам уже доступен ваш словарик и вы можете им оперировать.
    – iFreeman
    27 авг 2014 в 12:52

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.