2016-04-06 23 views
0

'a iletiyorum Swift'de yeni başlıyorum.Verileri CollectionView Delegesi'nden başka bir ViewController

benim UIViewController içinde CollectionView varsa ve kullanıcı başka ViewController için CollectionViewCell tıkladığında burada veri geçmeleri gerekiyor. prepareForSegue'u geçersiz kılmayı denedim ancak ilk önce aradığını ve didSelectItemAtIndexPath kodunu yazdığını fark ettim.

My First ViewController Kodu:

import UIKit 

class ViewController: UIViewController { 

    ... 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
} 

extension ViewController : UICollectionViewDataSource,UICollectionViewDelegate{ 

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

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

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCellWithReuseIdentifier("collCell", forIndexPath: indexPath) as! MainCollectionViewCell 

     ... 
     return cell 
    } 

    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 

     itemId = items[indexPath.item].id 

     let distinationViewController = DistinationViewController() 
     distinationViewController.itemId = itemId 
    } 
} 

Benim distination görünümü denetleyicisi kodu

import UIKit 

class DistinationViewController: UIViewController{ 

    var itemId : String! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 
     print(itemId) 
    } 
} 

DistinationViewController içinde itemId değeri

nil sayesinde

olduğunu
+0

Koleksiyon görünüm hücresinden ayarlanmış bir teklifiniz var mı? –

+0

@Keviv evet, –

+0

var, Tamam, 2 şey yapmalısın. 1. Segue'ınızı ViewController'dan ve hücreden değil bağlayın. 2. collectionView: didSelectItemAtIndexPath' içinde 'performSegueWithIdentifier' işlevini arayın ve oraya hedef görünümü denetleyicisini getirin ve orada itemID atayın. –

cevap

1

: Bu

gibi olacak

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 

     // Here you can check which Collection View is triggering the segue 
     if collectionView == collectionView1 { 
      self.performSegueWithIdentifier("fromFirstCollectionView", sender: nil); 
     } else if collectionView == collectionView2 { 
      // from other CollectionView 
     } 
    } 

ve prepareForSegue yöntemle:

  1. senin func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) aşağıdaki bir değiştirin

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    
         // Even here you can check for segue.identifiers if you have something to differentiate 
         let dvc = segue.destinationViewController as! DestinationViewController 
         dvc.itemId = "Hello" 
        } 
    
  2. senin Görünüm Denetleyicisi'nden
  3. Bağlan segue ve 3 collectionView sahip Yorumunuza göre o bir identifier

atamak yüzden 3 farklı tanımlayıcılarla 3 segues gerek sanırım.

Bu yardımcı olur umarız! Daha fazla sorunuz varsa tartışmaktan mutluluk duyarız.

+0

Harika, işe yarıyor, çok teşekkür ederim –

1

Sen gibi kod üzerinden görünümünü değiştirmek için deneyebilirsiniz:

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 
     itemId = items[indexPath.item].id 
     let distinationViewController = self.storyboard.instantiateViewControllerWithIdentifier("DestinationViewControllerStoryBoardID") as! DistinationViewController 

     distinationViewController.itemId = itemId 
self.navigationController.pushViewController(distinationViewController, animated: true) 
} 
+0

benim için çalışmamı gör. ancak ana storyboard denetleyicilerinin segue olmadan izin vermesi doğru mu? –

+0

evet, tamamıyla iyi. –

0

Sen prepareForSegue her şeyi koyabilirsiniz. Şunun gibi:

İki şey yapmanız gereken
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let identifier = segue.identifier{ 
     switch identifier { 
      case "distinationViewController": 
       if let nextScene = segue.destinationViewController as? DistinationViewController { 
        if let indexPath = self.collectionView.indexPathsForSelectedItems.lastItem { 
         nextScene.itemId=items[indexPath.item].id 
         nextScene.delegate = self 
       } 
      } 
      default: break 
     } 
    } 
} 
İlgili konular