UITableView 不使用 Cell 作为发件人

Posted

技术标签:

【中文标题】UITableView 不使用 Cell 作为发件人【英文标题】:UITableView Not Using Cell as Sender 【发布时间】:2016-08-25 05:24:30 【问题描述】:

我正在尝试 segue 和传递数据(从 UITableView 到 UIViewController)。我的代码是

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if segue.identifier == "IndividualAchievementsSegue" 
         let destination = segue.destinationViewController as? IndividualAchievementsViewController
        let cell = sender as! UITableViewCell
        let selectedRow = AchievementsTable.indexPathForCell(cell)!.row
         destination!.viaSegue = achievements[selectedRow]
        print(selectedRow)
    

但是 let cell = sender as! UITableViewCell 正在抛出

无法将“ProgramName.AchievementsViewController”类型的值转换为“UITableViewCell”

我也试过了

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if segue.identifier == "IndividualAchievementsSegue" 
         let destination = segue.destinationViewController as? IndividualAchievementsViewController
         let selectedRow = AchievementsTable.indexPathForSelectedRow!.row
         destination!.viaSegue = achievements[selectedRow]
        print(selectedRow)
    

这失败了,因为它发现 nil 在 achievements[selectedRow] 期间解包可选,因为这显然给了我来自 let selectedRow = AchievementsTable.indexPathForSelectedRow!.row 的 nil

【问题讨论】:

【参考方案1】:

我认为问题在于您的 segue 与您的 AchievementsViewController 连接到 IndividualAchievementsViewController 而不是 UITableViewCellIndividualAchievementsViewController。检查情节提要,并将TableCell 的segue 更正为IndividualAchievementsViewController

【讨论】:

我认为你是对的,但奇怪的是我通过从原型单元格单击并拖动到 IndividualAchievementsViewController 来创建 segue。但是,当我检查它时,通过将鼠标悬停在侧面的连接点上,它会选择整个视图控制器。将 TableCell 连接到 IndividualAchievementsViewController 有什么技巧吗? 首先删除那个旧的segue,然后在视图层次结构中,选择你的TableCell,然后按ctrl并将它拖到IndividualAchievementsViewController,希望你能接受。 选择segue后能否显示storyboard的图片,同时显示didSelectRowAtIndexPath的代码。这会更有帮助。 您的问题是您在 didSelecteRowAtIndexPath 内手动执行 segue,这就是问题所在,删除该行或评论,现在将 sender as! TableCell 转换为 prepareForSegue 内它将起作用。跨度> 你说的是 performSegueWithIdentifier("IndividualAchievementsSegue", sender: self) 吗?当它被删除时,PrepareForSegue 根本不会被调用【参考方案2】:

所以解决方案是进入 DidSelectrowAtIndexPath 并删除 DeselectRowAtIndexPath,它在那里意外出现了两次。然后使用以下

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if segue.identifier == "IndividualAchievementsSegue" 
        let destination = segue.destinationViewController as? IndividualAchievementsViewController
        let selectedRow = AchievementsTable.indexPathForSelectedRow?.row
        destination!.viaSegue = achievements[selectedRow!]
        print(selectedRow)
    

【讨论】:

以上是关于UITableView 不使用 Cell 作为发件人的主要内容,如果未能解决你的问题,请参考以下文章

小坑:UITableView分组后最后一根分割线不显示

UITableView滚动式cell错位

iOS如何固定UITableView中cell.imageView.image的图片大小

IOS 解决UITableView使用estimatedRowHeight后cell刷新后会跳动的问题

UITableView Cell 不应该水平滚动 swift iOS

[IOS开发教程] iOS如何固定UITableView中cell.imageView.image的图片大小