2016-04-06 16 views
0

私はSwiftの初心者です。CollectionView代理人から別のViewControllerにデータを渡します。

私はにCollectionViewを持っています。ユーザーがCollectionViewCellを別のViewControllerにクリックしたときにデータを渡す必要があります。 私はprepareForSegueを無効にしようとしましたが、最初にdidSelectItemAtIndexPathというコードを呼び出したことに気付きました。

私の最初のViewControllerコード:

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 
    } 
} 

マイDistinationビューコントローラコード

import UIKit 

class DistinationViewController: UIViewController{ 

    var itemId : String! 

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

DistinationViewControlleritemIdの値が

おかげ

nilであります
+0

segueはcollectionviewセルから設定していますか? –

+0

@Kevivはい、私は –

+0

です。さて、あなたは2つのことをする必要があります。 1.セルからではなくViewControllerからsegueを接続します。 2. 'collectionView:didSelectItemAtIndexPath'で' performSegueWithIdentifier'を呼び出してそこのビューコントローラをフェッチし、そこでitemIDを割り当てます。 –

答えて

1

あなたは二つのことを行う必要があります。

  1. はあなたfunc collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 1次 に変更し

    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 
         } 
        } 
    

    をして、あなたのprepareForSegue方法は、この

    ようになります
    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. あなたのビューコントローラから
  3. 接続segue、あなたはので、私はあなたが3つの異なる識別子を持つ3 seguesを必要とする3 collectionView推測しているあなたのコメントによると、それをidentifier

を割り当てます。

希望すると便利です。あなたはより多くの質問があれば議論してください。

+0

素晴らしいです、それは仕事です、ありがとう –

1

次のようなコードをビューを変更しようとすることができます:あなたは、あなたのprepareForSegueにすべてを置くことができ

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

です。セグメントなしでメインのストーリーボードコントローラを使用できるのは正しいですか? –

+0

はい、完全に問題ありません。 –

0

。このように:

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 
     } 
    } 
} 
関連する問題