代码之家  ›  专栏  ›  技术社区  ›  Terry B

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

  •  0
  • Terry B  · 技术社区  · 7 年前

    我是一个新的程序员,我在实现这个方面遇到了一些困难。我在数据模型中设置了几个类,如下所示:

    我在这里创建我的对象:

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

    我不太清楚该怎么做。

    感谢您的帮助!!

    ***我还有一个关于这个的问题-如果所讨论的视图控制器在堆栈中彼此相邻,所有的工作都很好,但是我需要以某种方式通过大约3个其他视图控制器传递数据…我试过使用下面答案中列出的Prepare for Segue方法,但是我想调用方法的viewController上的print语句表示单元格为零。我不知道如何将数据从第一个viewcontroller(我获取单元的位置)持久化到viewcontroller,我想在其中访问第一个viewcontroller的单元的索引。希望这有意义!请告诉我是否应该显示当前更新的代码以帮助说明这一点…谢谢您!

    1 回复  |  直到 7 年前
        1
  •  0
  •   Shehata Gamal    7 年前

    你需要通过 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?
    }