2015-07-24 8 views
3

Этот вопрос, вероятно, имеет очень простой ответ, но я не могу опустить его в голову. Я также не могу найти особенно полезный ответ, который работает в любом месте в Интернете.Segue из UICollectionView в Swift

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

if segue.identifier == "TripsToPastTripDetailsSegue" { 
     let newViewController = segue.destinationViewController as! pastTripDetailViewController 
     let selectedRow: NSManagedObject = tripsList[tableView.indexPathForSelectedRow!.row] as NSManagedObject 
     newViewController.passedTrip = selectedRow as! Trips 
    } 

Таким образом, с точки зрения таблицы я бы проходящее один объект (от Core Data) по сравнению с другим видом контроллер. Просто. Но я просто не могу перевести это на представление коллекции.

, которые я пытался что-то вдоль этих линий:

if segue.identifier == "pastTripCollectionToSavedLocationSegue" { 
     let newViewController = segue.destinationViewController as! pastTripDetailViewController 
     let selectedRow: NSManagedObject = locationsList[collectionView.indexPathForCell(pastLocationImageCollectionViewCell)] as! NSManagedObject 
     newViewController.passedTrip = selectedRow as! Trips 
    } 

Но это дает мне ошибку Не удается найти член «indexPathForCell», так что я, очевидно, делать что-то очень неправильно. Это одна из многих ошибок, которые я имел во время игры с кодом.

Может кто-нибудь указать мне в правильном направлении?

EDIT:

По просьбе @Laffen, то UICollectionView появляется в следующих местах в коде:

class pastTripDetailViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, MKMapViewDelegate { 

Как IBOutlet:

@IBOutlet weak var collectionView: UICollectionView! 

источника данных и делегата ViewDidLoad:

self.collectionView.dataSource = self 
self.collectionView.delegate = self 

А вот остальное:

func collectionView(collectionView: UICollectionView, numberOfSectionsInCollectionView indexPath: Int) -> Int { 
    return 1 
} 

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return self.locationsList.count 
} 

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

    let location = self.locationsList[indexPath.row] 
    let cell: pastLocationImageCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("imageCell", forIndexPath: indexPath) as! pastLocationImageCollectionViewCell 
    cell.locationImage.image = UIImage(data: location.image!) 

    return cell 
} 

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 
    performSegueWithIdentifier("pastTripCollectionToSavedLocationSegue", sender: self) 
} 
+0

Где вы инициализируете 'collectionView' и действительно ли это' UICollectionView'? – Laffen

+0

@ Laffen, я добавил остальную часть кода, относящегося к коллекцииView. –

+0

Я обновил свой ответ .. Я думаю, что он должен работать – Laffen

ответ

5

Может быть, это может работать для вас:

let indexPath: NSIndexPath = self.collectionView.indexPathsForSelectedItems().first! 
let selectedRow: NSManagedObject = locationsList[indexPath] as! NSManagedObject 

Это будет работать только если locationsList является словаря типа и инициализируется следующим образом:

var locationsList = [NSIndexPath: NSManagedObject]() 

Надеюсь, это полезно

Редактировать:

Кажется, вы пытаетесь пройти по типу pastLocationImageCollectionViewCell в indexPathForCell. Аргумент должен быть экземпляром типа pastLocationImageCollectionViewCell.

Попробуйте это:

Отредактировано: Пример ниже будет работать только по желанию при наличии только одной секции в UICollectionView.

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "pastTripCollectionToSavedLocationSegue" { 
     let newViewController = segue.destinationViewController as! pastTripDetailViewController 
     let indexPath = sender as! NSIndexPath 
     let selectedRow: NSManagedObject = locationsList[indexPath.row] as! NSManagedObject 
     newViewController.passedTrip = selectedRow as! Trips 
    } 
} 

// Set the indexPath of the selected item as the sender for the segue 
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 
    performSegueWithIdentifier("pastTripCollectionToSavedLocationSegue", sender: indexPath) 
} 
+0

Спасибо @Laffen, но теперь я получаю еще одну ошибку - 'Невозможно подстроить значение типа '[Locations]' с индексом типа« NSIndexPath »на строка 5 вашего ответа. :/ –

+0

Как я указал в своем ответе, чтобы иметь возможность использовать весь объект NSIndexPath в качестве параметра индекса, массив местоположений должен быть словарем с NSIndexPath в качестве ключа и координатами в качестве значения. Однако .. Если вы используете только один раздел, просто напишите 'indexPath.row' в качестве аксессуара массива. – Laffen

+0

это сделано. Спасибо за помощь. –

1

Попробуйте.

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 
self.performSegueWithIdentifier("yourSegueIdentifier", sender: self) 
} 
Смежные вопросы