【问题标题】:self.tableView not recognized as a UITableView, but rather a random methodself.tableView 不被识别为 UITableView,而是一个随机方法
【发布时间】:2026-01-10 20:15:02
【问题描述】:

为了一个非常简单的问题,我在 xCode 上苦苦挣扎了好几个小时。我正在继承 UITableViewController,并且在 scrollViewDidScroll 方法中,我尝试访问我可见的 tableview 行,如下所示:

class ShinySubclass: UITableViewController {
    override func scrollViewDidScroll(scrollView: UIScrollView) {
        let visibleIndexPaths : [NSIndexPath] = self.tableView.indexPathsForVisibleRows()
        ...
    }
}

虽然我收到了这个可爱的信息,指向自我。tableView:

ShinySubclass.swift:58:48: '(UITableView, numberOfRowsInSection: Int) -> Int' 没有名为 'indexPathsForVisibleRows' 的成员

这对我来说似乎是一个 xCode 错误。我有最新版本(版本 6.1 (6A1052d)),我尝试过清理、重建、打开/关闭房间灯等...

任何想法如何绕过它?

【问题讨论】:

    标签: uitableview swift


    【解决方案1】:

    indexPathsForVisibleRows 返回[AnyObject]?,但您试图分配给非可选的[NSIndexPath] 变量。如果您只是让类型推断完成代码编译的工作:

    let visibleIndexPaths  = self.tableView.indexPathsForVisibleRows()
    

    这会返回一个AnyObject 的数组,因此您可能希望向下转换为正确的类型,但在这种情况下需要向下转换:

    let visibleIndexPaths = self.tableView.indexPathsForVisibleRows() as? [NSIndexPath]
    

    但是,由于我假设如果该数组不是 nil 时您想要进行一些处理,并且考虑到如果没有可见行,indexPathsForVisibleRows 可以返回 nil,您可以使用可选绑定:

    if let visibleIndexPaths = self.tableView.indexPathsForVisibleRows() as? [NSIndexPath] {
        ...   
    }
    

    在这种情况下,visibleIndexPaths 是一个非可选数组 [NSIndexPath]

    【讨论】:

    • 成功了! xCode 确实需要改进它的错误消息,以便快速......我无法将我犯的错误与我得到的错误消息联系起来。
    • 是的,这是 swift 编译器的常见问题。我认为这可以通过类型推断试图找到返回[NSIndexPath]的方法来解释,这当然不存在。
    • 可能会更糟。一些应该产生错误并拒绝构建的东西会尝试编译并遇到段错误(编译器段错误)。