removeFromSuperView() 和单元格 = 致命错误:在展开可选值时意外发现 nil
Posted
技术标签:
【中文标题】removeFromSuperView() 和单元格 = 致命错误:在展开可选值时意外发现 nil【英文标题】:removeFromSuperView() and cells = fatal error: unexpectedly found nil while unwrapping an Optional value 【发布时间】:2016-04-02 17:48:01 【问题描述】:我在 XIB 中使用 CustomCell 做一个小的 UITableView。
如果布尔值为 FALSE,我想删除视图。
所以我做的只是一个小功能:
func deleteStackOrNot(valeurPLIST: Bool, stack: UIStackView)
if valeurPLIST
stack.hidden = false
else
stack.removeFromSuperview()
然后:
deleteStackOrNot((corpusArray[indexPath.row]["iconesNPBool"] as! Bool), stack: cell.iconesStackOutlet)
在第一次向下滚动时效果很好,在 2 个单元格上。但是,当我滚动回第一个单元格时,我得到:
fatal error: unexpectedly found nil while unwrapping an Optional value
指向函数调用。
我想我已经删除了出口,比如“永远”,现在 xcode 似乎无法重新创建它......
我也尝试过 .hidden 但我需要将其删除,因为当视图隐藏时约束仍然存在。
你怎么看?
【问题讨论】:
【参考方案1】:你有几个选择:
-
您可以将 UIStackView 属性添加到自定义单元格类中,以在视图不在层次结构中时保存视图并将其添加回来
您可以只使用堆栈视图创建一个 .XIB,然后通过加载它来构建一个新的。
如果堆栈视图为 nil,您可以在代码中重新创建堆栈视图
您不能删除它,而只能更改约束(或其大小)
编辑:要做#1
添加:
var hiddenStack: UIStackView?
然后,在你的 func 中(在注释所在的地方填写正确的代码):
func deleteStackOrNot(valeurPLIST: Bool, stack: UIStackView)
if valeurPLIST
// put the hidden stack back in the view here
// using self.hiddenStack
else
self.hiddenStack = stack
stack.removeFromSuperview()
【讨论】:
我认为第四个选项应该没问题,但是我也尝试过,但是,当我执行 cell.mapOutlet.frame = CGRectMake(0, 0, 0, 0) 时没有任何变化…… 该框架可能与您的约束冲突。我推荐选项 #1 作为最简单且最有可能工作的选项 嗯,我不确定我是否真的理解这意味着什么,但我会在谷歌上查找,除非有人知道如何说清楚? 我遇到了同样的问题。我真的不知道我有多正确,但它可以满足我的需求。代码很简单:if let wv = cell.webView if myBool == false wv.removeFromSuperview()
以上是关于removeFromSuperView() 和单元格 = 致命错误:在展开可选值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章
自定义 UITableViewCells 和正确使用 prepareForReuse 和 removeFromSuperview
在 removeFromSuperview 和 addSubview 之后界面方向保持不变