2016-12-12 4 views
0

Я хочу передать данные из ячейки collectionView в другой контроллер представления. Я зашел так далеко, но я застрял. В принципе, я хочу передать текст метки внутри ячейки collectionView на метку с другого контроллера представления. Код ниже не работает. Я думаю, мне нужно добавить код, который сообщает, какая ячейка была нажата. Кстати, когда я изменить эту строку viewController.dataLabelObject = valueToPass к этому viewController.dataLabelObject = "Hello" я могу увидеть его на другой контроллерПолучение indexPath элементов коллекцииView

var valueToPass: String! 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    { 
     if segue.identifier == "mySegue" 
     { 
      let viewController = segue.destination as! AnimalsViewController1 
      viewController.dataLabelObject = valueToPass 
     } 
    } 

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
    { 
     let currentCell = myCollectionView.cellForItem(at: indexPath) as! CollectionViewCell1 
     valueToPass = currentCell.textLabel.text 


     performSegue(withIdentifier: "mySegue", sender: self) 
    } 
+1

То, как вы пытаетесь решить проблему, в корне неверно. Представления не предназначены для переноса данных, это работа для моделей. При этом вы можете захватить модель, которая предоставила значение метки в первую очередь, а затем передать значение. – Alladinian

ответ

0

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

Вместо того, чтобы пытаться извлечь данные из ячейки, пользователь прослушивает, получает путь указателя к выбранной ячейке и ищет данные в вашем массиве. Кроме того, добавьте операторы печати по пути, чтобы выяснить, что происходит:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
{ 
    valueToPass = myArray[indexPath.row] 
    print("In \(#function), valueToPass = \(valueToPass)") 
    performSegue(withIdentifier: "mySegue", sender: self) 
} 

А затем передать эти данные в контроллер представления назначения:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
{ 
    if segue.identifier == "mySegue" 
    { 
     let viewController = segue.destination as! AnimalsViewController1 
     print("In \(#function), valueToPass = \(valueToPass)") 
     viewController.dataLabelObject = valueToPass 
    } 
} 

Добавить заявление для печати в контроллере представления назначения для входа значение dataLabelObject при загрузке.

+0

Хорошо, я сделал это. Когда я запускал свое приложение, я получил это на консоли 'In prepare (for: sender :), valueToPass = nil В collectionView (_: didSelectItemAt :), valueToPass = Необязательный (« cat ») В режиме подготовки (для: отправителя :), valueToPass = Необязательный («cat») 'valueToPass - нуль в первом, но имеет значение в последнем. И он не отображается во втором контроллере представления –

+0

Похоже, вы дважды вызываете segue. У вас есть segue, связанный непосредственно с вашими ячейками, а также вызывая его в «didSelectItemAt»? –

+0

Почему голос? Если вы считаете, что мой ответ так или иначе, пожалуйста, скажите мне, почему? –

-1

Вы это выполнить неправильно. Прежде всего, вы не должны передавать данные из меток, то это будет лучше, если вы храните строки в контроллере:

var strings: [Strings]! 

Затем, когда вы выборе ячейки, проходят indexPath в sender:

performSegue(withIdentifier: "mySegue", sender: indexPath) 

В подготовиться к следующему этапу:

let indexPath = segue.sender as! IndexPath 
let string = strings[indexPath.item] 
viewController.dataLabelObject = string 
+0

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

+0

@ DuncanC ofc, это было неправильно, и я хотел добавить ответ с подробностями. –

+0

Я предлагаю сказать что-то вроде «Один из вариантов - использовать параметр отправителя в вызове' performSegue (withIdentifier: sender:) 'для передачи параметра в ваш метод' prepare (for: sender:) '. Это нетрадиционный, но он работает ». –