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

Posted

技术标签:

【中文标题】如何根据点击的 UITableView 行更改方法的参数?【英文标题】:How can I change a parameter of a method depending on which UITableView row was tapped? 【发布时间】:2018-05-22 17:02:56 【问题描述】:

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

我在这里创建我的对象:

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

我不确定如何做到这一点。

在这里提前一百万感谢您的帮助!

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

您好,感谢您在这里提供帮助。我尝试添加此代码,并且在目标 VC(您正在调用 NextViewController - 我的称为“ViewController”)中,我收到一个 SIGABRT 错误,上面写着:无法转换类型“SampleSequencer.BlackViewController”的值(0x10a3b2520 )到“SampleSequencer.ViewController”(0x10a3b2728)。另外,我不知道如何在您的示例之后继续进行 - 就像实际更改值一样(我打算这样做会很有趣)谢谢! 你是如何在 prepareForSegue 中投射值的,nextVC 是 BlackViewController 吗?? 嗨,我只是有点困惑 - 可能是我遇到问题的原因!因此,从 ChooseVC 到 BlackVC,然后到 MainVC,然后我要访问的方法在“ViewController”中) if segue.identifier == "BlackToDetail" 让 nextScene = segue.destination 为! ViewController nextScene.selectedRow = sender as? Int 我猜这是因为 segue 转到 black vc 而我需要的 segue 是两个名为“nextVC”的 VC? 我将 segue 标识符更改为正确的名称“nextVC”并且崩溃停止。现在我想知道如何尝试更改参数? 好的,继续……我得继续努力。你是最棒的,@Sh_Khan !!

以上是关于如何根据点击的 UITableView 行更改方法的参数?的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 加载完成后可以调用函数吗?

如何更改 UItableview 的数据?

快速展开和收缩 UITableView 一行

在特定行选择上更改 UITableView 所有行的标签颜色

显示 UITableView 的本地化字母索引

在 UITableView 中使用插入行