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
而不是 UITableViewCell
到 IndividualAchievementsViewController
。检查情节提要,并将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 作为发件人的主要内容,如果未能解决你的问题,请参考以下文章
iOS如何固定UITableView中cell.imageView.image的图片大小
IOS 解决UITableView使用estimatedRowHeight后cell刷新后会跳动的问题