【问题标题】:UITableView Not Using Cell as SenderUITableView 不使用 Cell 作为发件人
【发布时间】: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

【问题讨论】:

    标签: ios uitableview


    【解决方案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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多