2017-02-20 6 views
0

私は迅速に新しいですし、ViewController.NowにcollectionView機能を実装しようと、私はUICollectionViewCellの三種類を持っているが、ここに私のコードです:SwiftでのswitchView関数の実装にswitch文を使用するにはどうすればよいですか?

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    if collectionView == self.collectionViewCategory { 

     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: categoryIdentifier, for: indexPath as IndexPath) as! CategoryCell 

     cell.CategoryIcon.image = self.categoryItems[indexPath.item] 
     cell.layer.borderColor = UIColor.lightGray.cgColor 
     cell.layer.borderWidth = 1 
     cell.layer.cornerRadius = 5 

     return cell 
    } 
    else if collectionView == self.collectionViewHour { 

     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: hourIdentifier, for: indexPath as IndexPath) as! HourCell 

     cell.hourItem.text = self.hourItems[indexPath.item] 
     cell.layer.borderColor = UIColor.lightGray.cgColor 
     cell.layer.borderWidth = 1 
     cell.layer.cornerRadius = 5 

     return cell 
    } 
    else { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: minuteIdentifier, for: indexPath as IndexPath) as! MinuteCell 

     cell.minuteItem.text = self.minuteItems[indexPath.item] 
     cell.layer.borderColor = UIColor.lightGray.cgColor 
     cell.layer.borderWidth = 1 
     cell.layer.cornerRadius = 5 

     return cell 
    } 
} 

は、私は同じ効果を達成するためにswitchステートメントを使用することはできますしてください?コードは少しエレガントに見えますか?

私は私のコードは次のようになります願っています:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    let cell:UICollectionViewCell 

    switch collectionView { 
     case self.collectionViewCategory: 
      cell = collectionView.dequeueReusableCell(withReuseIdentifier: categoryIdentifier, for: indexPath as IndexPath) as! CategoryCell 
      cell.CategoryIcon.image = self.categoryItems[indexPath.item] 
     case self.collectionViewHour: 
      cell = collectionView.dequeueReusableCell(withReuseIdentifier: hourIdentifier, for: indexPath as IndexPath) as! HourCell 
      cell.hourItem.text = self.hourItems[indexPath.item] 
     default: 
      //do nothing. 
    } 
    cell.layer.borderColor = UIColor.lightGray.cgColor 
    cell.layer.borderWidth = 1 
    cell.layer.cornerRadius = 5 
    return cell 
} 

しかし、私は多くのミスを得た、と私はそれらを修正する方法がわかりません。

+0

は、すべての可能な場合のために列挙型を追加します。 –

+0

ありがとうございます!私は試してみます。 –

答えて

0

・ホープ、このヘルプを実装:

はここでは使用することができます素敵なサブクラスです。全くテストしない。何か問題がある場合は、スナップを取ることができますか?

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    let cell:UICollectionViewCell 

    switch collectionView { 
    case self.collectionViewCategory: 
     let categoryCell = collectionView.dequeueReusableCell(withReuseIdentifier: categoryIdentifier, for: indexPath as IndexPath) as! CategoryCell 
     categoryCell.CategoryIcon.image = self.categoryItems[indexPath.item] 
     cell = categoryCell 
    case self.collectionViewHour: 
     let hourCell = collectionView.dequeueReusableCell(withReuseIdentifier: hourIdentifier, for: indexPath as IndexPath) as! HourCell 
     hourCell.hourItem.text = self.hourItems[indexPath.item] 
     cell = hourCell 
    default: 
     //do nothing. 
    } 
    cell.layer.borderColor = UIColor.lightGray.cgColor 
    cell.layer.borderWidth = 1 
    cell.layer.cornerRadius = 5 
    return cell 

}

+0

Thx a lot!ほぼ完成しました。今はデフォルトで "ブレーク"を追加しなければなりません。そして、switch文の下で "Constant 'cell'が初期化される前に使われていると言うコンパイラを取得します。これを修正するために空のUICollectionViewCellを定義できますか? –

+0

はい。デフォルトでは、セルがinitになるようにしてください。 –

2

あなたはとても

collectionView.tag = 1 

のように各collectionViewに固有のタグを割り当て、識別子としてタグを使用しようとすることができます:

switch collectionView.tag { 
    case 0: 
     // some code 
    case 1: 
     // some code 
    default: 
     // some code 
} 

あなたはUITableViewCellの内側にあなたのcollectionViewsを使用している場合それぞれcollectionView.tagindexPath.sectionまたはindexPath.rowに設定してtableView(_ tableView: willDisplay cell: forRowAt indexPath:)に設定します。

class CollectionViewTableViewCell: UITableViewCell { 
    @IBOutlet weak var collectionView: UICollectionView! 

    func setCollectionViewDataSourceDelegate(dataSource: UICollectionViewDataSource?, dataDelegate: UICollectionViewDelegate?, forSection section: Int) { 

     collectionView.delegate = dataSource as! UICollectionViewDelegate? 
     collectionView.dataSource = dataDelegate as! UICollectionViewDataSource? 
     collectionView.tag = section 
     collectionView.reloadData() 
    } 
} 

、その後、あなたのビューコントローラに

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    guard let tableViewCell = cell as? CollectionViewTableViewCell else { return } 
    tableViewCell.setCollectionViewDataSourceDelegate(dataSource: self, dataDelegate: self, forSection: indexPath.section) 
} 
+0

スウィフトはそれらの「休憩」を必要としません。 – vacawama

+0

公式の[documentation](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ControlFlow.html)のように、あなたは本当に正しいです。私は答えを編集しました、ありがとう!私はそれを知らなかった。私はそれが他の言語などから来ている私の過去の自己だと思います:) –

関連する問題