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 之后界面方向保持不变

关于removeFromSuperview

UIView 子类中的 self.removeFromSuperview()

出口集合 removefromsuperview

removeFromSuperview 随机崩溃