【问题标题】:Swift Newbie Argument labels '(_:, IndexPath:)' do not match any available overloadsSwift新手参数标签'(_:,IndexPath :)'不匹配任何可用的重载
【发布时间】:2026-02-09 23:15:02
【问题描述】:

当我调用 tableView 函数时,标题中出现错误。我的问题是为什么即使它们是请求的类型,函数也不接受这两个参数?再说一次,我是新手,所以如果答案很明显,请原谅我。

class TableViewController: UITableViewController { 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: NSIndexPath) -> UITableViewCell { 
        let cell = tableView.dequeueReusableCell(withIdentifier: "itemCell") as! UITableViewCell 
        let name = Array(shopItems.keys) [indexPath.row]
        let cost = Array(shopItems.values) [indexPath.row] 
        cell.textLabel?.text = name + String(cost)
        return cell 
    }
}

当我这样调用函数时:

“TableViewController.tableView(shopTableView, IndexPath: NSIndexPath)”我收到错误:“参数标签 '(_:, IndexPath:)' 不匹配任何可用的重载”

【问题讨论】:

  • 你为什么要调用这个方法呢?你不应该调用这个方法。您应该编写此方法,并让框架调用它。
  • 我希望在用户按下按钮时调用它,这样每次用户点击时都会添加一个单元格
  • 这不是您将新单元格添加到表格视图的方式。见this
  • 如果我使用该帖子中提供的调整代码运行我的应用程序,我会收到此错误:“尝试将第 0 行插入第 1 部分,但更新后只有 1 个部分”

标签: swift xcode


【解决方案1】:

尝试使用

 let name = shopItems.keys[indexPath.row]

代替

    let name = Array(shopItems.keys) [indexPath.row]

最好不要使用强制包装,当它不是nesesery时。 尝试改变

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

 guard let cell = tableView.dequeueReusableCell(withIdentifier: "itemCell") as? UITableViewCell else { 
    return UITableViewCell()
}

编辑:正如@Sh_Khan 所说的替换

func tableView(_ tableView: UITableView, cellForRowAt indexPath: NSIndexPath) -> UITableViewCell {

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

【讨论】:

  • 当我更改名称和成本常量时,我​​收到此错误:“无法使用 'Int' 类型的索引为 'Dictionary.Keys' 类型的值下标”。而且我仍然得到我原来的错误
  • 我不知道这是一本字典。在这种情况下,请恢复您拥有的版本
  • 是的,很抱歉我应该提到这一点。基本上我有一个接受字符串和整数的字典,这个函数应该创建一个表格视图单元格,其中字符串和整数作为其标签
  • 最好不要使用强制换行。不,在这种情况下,欢迎强制展开,因为如果一切都正确连接,代码不得崩溃。如果确实如此,则表明存在 设计 错误。如果出现上述设计错误并且您不知道原因,可选绑定不会显示任何内容。糟糕的用户体验在这两种情况下都是一样的。
  • @vadian - 更好的用户体验 您可以显示有关错误和关闭视图的信息的弹出窗口。总比崩溃好
【解决方案2】:

有一种简单快捷的方法可以让自己找出正确的重载

  1. 选择整个方法并按⌘/注释掉代码。
  2. 在类类型cellForRow 的顶层。代码完成列表中的第一项是正确的方法。
  3. Return 插入正确的方法。
  4. 再次选择该方法并按 ⌘/错误 方法进行注释。
  5. 将错误方法的正文复制并粘贴到正确的方法中。
  6. 删除其余错误方法。

【讨论】:

  • 谢谢,但我仍然无法正常工作。 Sweeper 提到我不应该调用该方法,但我不明白为什么。我不需要为函数提供一个表格视图来执行该方法吗?
  • 清道夫是对的。您不能自己调用​​该方法。在您调用tableView.reloadData() 之后,框架会立即调用该方法。但是您还必须覆盖 numberOfRowsInSection 以返回要显示的行数。