如何根据点击的UITableView行更改方法的参数?

时间:2018-05-22 17:02:56

标签: ios swift uitableview

我是一名新程序员,我遇到了一些麻烦。我在我的数据模型中设置了几个类,如下所示:

我在这里创建我的对象:

import Foundation
import UIKit

class PracticePads {

var padTitle: String

var padImage: UIImage

var  soundPreset: Int

init(pad: UIImage, title: String, preset: Int ) {

    self.padImage = pad
    self.padTitle = title
    self.soundPreset = preset
}

}

然后我创建一个像这样的数组的另一个文件:

class PracticePadBank {

var list = [PracticePads]()

init(){

        let pad1 = PracticePads(pad: #imageLiteral(resourceName: "Hard Neoprene Pad"), title: "Pad 1", preset: 0)
        let pad2 = PracticePads(pad: #imageLiteral(resourceName: "Hard Neoprene Pad"), title: "Pad 2", preset: 0)

        let pad3 = PracticePads(pad: #imageLiteral(resourceName: "Hard Neoprene Pad"), title: "Pad 3", preset: 0)
        let pad4 = PracticePads(pad: #imageLiteral(resourceName: "Hard Neoprene Pad"), title: "Pad 4", preset: 0)
        let pad5 = PracticePads(pad: #imageLiteral(resourceName: "Hard Neoprene Pad"), title: "Pad 5", preset: 0)            
        list.append(pad1)
        list.append(pad2)
        list.append(pad3)
        list.append(pad4)
        list.append(pad5) 
}
}

在另一个ViewController中,我设置了一个UITableView,让用户可以选择这样的“练习垫”:

class ChooseViewController: UIViewController {

var pads: [PracticePads] = []
let allPads = PracticePadBank()
var audioPlayer = AVAudioPlayer()

@IBOutlet weak var tableView: UITableView!


  override func viewDidLoad() {
  super.viewDidLoad()
    pads = allPads.list

}

}

extension ChooseViewController: UITableViewDataSource, UITableViewDelegate{

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return pads.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let pad = pads[indexPath.row]

    let cell = tableView.dequeueReusableCell(withIdentifier: "PadCell") as! PadCell

    cell.setPad(pad: pad)

    return cell

}




func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self .performSegue(withIdentifier: "BlackToDetail", sender: nil)

    }  
}

这个UITableView会将用户带到另一个VC,在那里他们可以选择不同的练习。我现在设置UIButtons转换到另一个VC,其中方法是我想要更改(预设)的参数基于划线的行:

func loadSF2PresetIntoSampler(preset:UInt8)  {

    guard let bankURL = Bundle.main.url(forResource: "Pad Sounds", withExtension: "sf2") else {
        print("could not load sound font")
        return
    }

    do {
        try sampler.loadSoundBankInstrument(at: bankURL, program: preset,bankMSB: UInt8(kAUSampler_DefaultMelodicBankMSB),bankLSB: UInt8(kAUSampler_DefaultBankLSB))
    } catch {
        print("error loading sound bank instrument")
    }
}

我不确定如何实现这一目标。

预先感谢一百万人提供任何帮助!!

***我还有一个问题 - 如果所讨论的ViewControllers在堆栈中彼此相邻,那么一切都运行得很好,但我需要以某种方式通过大约3个其他视图控制器传递数据。我已经尝试使用下面在答案中列出的准备Segue方法,但我想调用方法的ViewController上的print语句表示该单元格为零。我不确定如何将数据从第一个ViewController(我将获取单元格)保存到ViewController,我想在其中访问第一个ViewController单元格的索引。希望这是有道理的!如果我应该显示我当前更新的代码以帮助说明这一点,请告诉我...谢谢!

1 个答案:

答案 0 :(得分:0)

您需要传递indexPath.row

 self .performSegue(withIdentifier: "BlackToDetail", sender: indexPath.row)

//

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "BlackToDetail" {
       let nextScene = segue.destination as! NextViewController 
       nextScene.selectedRow = sender as! Int
    }

}

//

class NextViewController: UIViewController {
     var selectedRow:Int?
}