Le Collection View

Giuseppe Sapienza

Le Collection View

Per favore acquista corso prima di iniziare la lezione.

Compatibile con Xcode 8

Hai un problema con la lezione? scrivi un commento in fondo alla pagina - non mordo!

Cos'è una Collection View e perché tutti conoscono le tabelle e pochi le collezioni di elementi? Se una Table View è una lista di elementi verticali, la Collection View è un tabella con righe verticali e/o orizzontali. Se apri l'applicazione Foto ed entri dentro un album troverai una griglia di fotografie. Bene, questa è una Collection [...]

Lista Lezioni

Corso creare applicazioni per iOS con il linguaggio Swift

Torna a: Corso creare applicazioni per iOS con il linguaggio Swift > TableView, TabBar e CollectionView
  • nickbonny

    Ciao Beppe,
    vorrei fare in modo che quando clicco su una cell mi si apra il secondVC con la foto ingrandita. Però non riesco a fare come avevamo fatto per la tableView. Cioè nel didSelect volevo assegnare ad una variabile di classe la row della mia cella selezionata, poi fare il performSegueWithIdentifier e mettere come sender il valore della row..
    Il problema è che non esiste myCollectionView.indexPathForSelectedRow.. Quindi come posso fare?

    • Ciao Nick,

      Le collection View hanno un metedo chiamato indexPathsForSelectedItems che restituisce un array di NSIndexPath. L’array ritornato può essere opzionale perché potrebbe succedere che un utente non seleziona celle.
      Dato che è un array, la prima cella selezionata è sicuramente quella in posizione 0. Se non è abilitato la multi seleziona sicuramente ci sarà solo un elemento all’interno dell’array:

      let array_indexPathSelected = self.myCollectionView.indexPathsForSelectedItems()
      let rowCellaSelezionata = array_indexPathSelected![0].row

      Ricordati che l’array è opzionale quindi devi gestire l’opzionalità con un guard o if let.

      Fammi sapere ;)

      • nickbonny

        Ok grazie mille! Adesso sono riuscito a fare quello che mi serviva

  • Arcy

    Non capisco perché Apple non ha messo la possibilità di inserire le celle in modalità Stack View invece di far fare all’utente calcoli da codice. Anche perché così è tutto molto frammentato…alcune cose le hai da codice, altre da storyboard e nel debuggare o versione il codice diventa poi un po’ un problema…

    • In questo momento Apple è in una fase di transizione. Le stack view sono un esempio tangibili di questa transizione verso l’utilizzo preponderante dello storybooard. Dall’altro lato i tool drag and drop stanno diventando un metodo di sviluppo veloce soprattutto in ambiente video ludico e d’animazioni (gamebox e Blender ne ed il nuovo software per creare giochi di Amazon ne sono un esempio). Quindi aspettiamoci delle belle news al prossimo wwwdc.
      Per il momento non possiamo che utilizzare questi sistemi

      Giuseppe Sapienza
      xCoding.it | Sviluppa, Crea e codifica i tuoi sogni!

  • fabiod

    Giuseppe ciao, scusa se ti disturbo per una cosa che, probabilmente, sarà una banalità. Ma non riesco ad andare avanti.
    Mi sembra di aver seguito alla lettera le tue istruzioni ma qualcosa non funziona, perché mi da errore alla riga: self.myCollectionView.dataSource = self
    In particolare riporta che myCollectionView è nil
    Cosa ho combinato? Qui c’è il codice del ViewController. Grazie mille e scusa il disturbo.

    import UIKit
    class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
    @IBOutlet var myCollectionView: UICollectionView!

    override func viewDidLoad() {
    super.viewDidLoad()

    self.myCollectionView.dataSource = self
    self.myCollectionView.delegate = self
    }
    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    }

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

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 10
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(“CollectionCell”, forIndexPath: indexPath) as! CustomCollectionViewCell
    cell.immagine1.image = UIImage(named: “panorama”)
    return cell
    }

    }

    • fabiod

      Ho risolto. Dopo ore a confrontare il mio file con il tuo, mi sono accorto che il puntino in corrispondenza di
      @IBOutlet var myCollectionView: UICollectionView!
      era vuoto. Insomma per qualche motivo non era piò collegato al CollectionView dello Storyboard.
      “Per un punto Martin perse la cappa..!”
      grazie lo stesso, alle prossime domande.

  • Marcello Ruta

    Posto il code in swift 3 per implementare il dettaglio dell’immagine:

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    print(“Item selected: (indexPath.row)”)

    let this_cell = collectionView.cellForItem(at: indexPath)
    print(“contenuto cella: (this_cell)”)
    performSegue(withIdentifier: “segueShowCell”, sender: this_cell)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    guard let identifier = segue.identifier else {
    return
    }

    if identifier == “segueShowCell” {

    guard let senderIsEmpty = sender else {
    return
    }

    let img = (senderIsEmpty as! CustomCollectionViewCell).imageView!.image!
    print(“-[segueShowCell] Sto per inviare: “, img)

    let send_image = segue.destination as! DetailViewController
    send_image.image_ricevuta = img
    }
    }

    questo è il codice che va messo nel ViewController dove c’è la griglia di immagini (cioè la Collection View)

    • grazie Marcello ;)

      Giuseppe Sapienza
      Founder | xCoding.it – Sviluppa, Crea e Codifica i tuoi Sogni

Start typing and press Enter to search