SWIFT 3:将不同的声音文件数组与CollectionView中的每个部分匹配

时间:2016-10-14 16:38:08

标签: ios arrays swift audio

使用Swift 3

我已经设置了一个包含7个部分的collectionView - 当用户点击一个单元格(按钮)时,特定声音将从一组声音中播放。

那么如何拆分collectionView中的部分以匹配特定的声音数组?

例如

1)当用户点击collectionView第1部分中的单元格(按钮)时,soundArray1中的声音将会播放

2)当用户点击collectionView第2部分中的单元格(按钮)时,soundArray2中的声音将会播放

3)当用户点击collectionView第3节中的单元格(按钮)时,soundArray3中的声音将会播放

一直到第7节。

以下是用户点击cellButton

时的当前代码
func numberOfSections(in collectionView: UICollectionView) -> Int {
    return sections.count
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    if section == 0 {
        return self.appleProducts.count

    } else if section == 1 {
        return self.animals.count

    } else if section == 2 {
        return self.food.count

    } else if section == 3 {
        return self.activity.count

    } else if section == 4 {
        return self.travel.count

    } else if section == 5 {
        return self.objects.count

    } else if section == 6 {
        return self.symbols.count

    } else {
        return 0
    }
}

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

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell

    if indexPath.section == 0 {
        cell.cellButton.setTitle(appleProducts[indexPath.row], for: UIControlState.normal)

    } else if indexPath.section == 1 {
        cell.cellButton.setTitle(animals[indexPath.row], for: UIControlState.normal)

    } else if indexPath.section == 2 {
        cell.cellButton.setTitle(food[indexPath.row], for: UIControlState.normal)

    } else if indexPath.section == 3 {
        cell.cellButton.setTitle(activity[indexPath.row], for: UIControlState.normal)

    } else if indexPath.section == 4 {
        cell.cellButton.setTitle(travel[indexPath.row], for: UIControlState.normal)

    }  else if indexPath.section == 5 {
        cell.cellButton.setTitle(objects[indexPath.row], for: UIControlState.normal)

    } else if indexPath.section == 6 {
        cell.cellButton.setTitle(symbols[indexPath.row], for: UIControlState.normal)
    }

    cell.cellButton.tag = indexPath.row

    return cell
}

@IBAction func cellButton(_ sender: AnyObject) {
    let sound =  (sender as! UIButton).tag
    self.setupAudioPlayer(file: Sounds[sound] as NSString, type: ".m4a")
    self.soundPlayer.play()
}

其中Sounds是声音文件的数组1。然而,这一系列声音文件正在playView的所有部分播放。我无法弄清楚如何分割每个声音数组以匹配collectionView

中的每个部分

1 个答案:

答案 0 :(得分:0)

您可以使用collectionView方法indexPathForItem(at point: CGPoint)来获取正确的索引路径。像这样:

func didPressBtn(sender: UIButton) {
    let point = sender.center
    let cvPoint = self.collectionView!.convert(point, from: sender.superview)
    let ip = self.collectionView!.indexPathForItem(at: cvPoint)!        
    print("Button \(ip.section):\(ip.row) pressed")
    // You can then use ip.section to decide which array to use
    // and ip.row to choose the correct element from the array.  Like this:
    if (ip.section == 0) {
        self.setupAudioPlayer(file: soundsArray1[ip.row] as NSString, type: ".m4a")
        self.soundPlayer.play()}
    } else if (ip.section == 1) {
        self.setupAudioPlayer(file: soundsArray2[ip.row] as NSString, type: ".m4a")
        self.soundPlayer.play()}
    } else if (ip.section == 2) {
        self.setupAudioPlayer(file: soundsArray3[ip.row] as NSString, type: ".m4a")
        self.soundPlayer.play()}
    } // etc etc 
}

关于“对成员的模糊引用”错误,我在上面的代码中假设您要么使用UICollectionViewController,它具有collectionView属性,或者创建了collectionView UIViewController中的属性,用于引用集合视图。要添加一个(或检查),您应该

@IBOutlet var collectionView : UICollectionView!

在您的班级定义中。然后在故事板中,您需要将相关场景中的集合视图链接到视图控制器。要执行此操作,请从场景顶部的视图控制器图标(黄色圆圈)按住Ctrl键拖动到集合视图。出现提示时,从出口列表中选择“collectionView”:

enter image description here

您可以检查右侧窗格的Connections Inspector中是否已建立链接:

enter image description here