【问题标题】:Swift View is not hiding subViews correctlySwift View 没有正确隐藏子视图
【发布时间】:2021-01-27 06:21:27
【问题描述】:

底部更新

在我的ViewController 中,我有一个TableViewCustomCells。这些cells 中呈现的内容取决于userInput。我认为解释问题的最佳方式是实际展示它:

1.将cells 添加到tableView

looking as expected

2。问题:在关闭ViewController 并返回它之后:

showing views that should actually be hidden in the first cell

顺便说一句,当我在调试器中打开 View-Hirarchy 时,它正在正确显示!

这里还有一个video,方便大家理解:video 在这种情况下,我没有添加image,但是当返回viewController 时,它仍然显示imageContainerView(shadow) 以及第一个单元格的content

代码:

我的代码非常复杂和混乱,所以你可以在这里关注我:

CustomCell 中的设置视图:

我不认为这很有帮助,但我也不认为 setup 是这里的问题。

func setupViews(){
    
    contentView.addSubview(checkButton)
    contentView.addSubview(mainStackView)
    
    // main StackView
    mainStackView.addArrangedSubview(label)
    
    mainStackView.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
    mainStackView.leadingAnchor.constraint(equalTo: checkButton.trailingAnchor, constant: 15).isActive = true
    mainStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -30).isActive = true
    mainStackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
    
    //constrain wish label
    labelHeightConatraint = label.heightAnchor.constraint(equalToConstant: 50)
    labelHeightConatraint.priority = .defaultHigh
    labelHeightConatraint.isActive = true
    
    // constrain checkButton
    checkButton.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 30).isActive = true
    checkButton.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true
    checkButton.widthAnchor.constraint(equalToConstant: 40).isActive = true
    checkButton.heightAnchor.constraint(equalToConstant: 40).isActive = true

    mainStackView.addArrangedSubview(secondaryStackView)
    secondaryStackViewHeightConstraint = secondaryStackView.heightAnchor.constraint(equalToConstant: 90)
    secondaryStackViewHeightConstraint.priority = .defaultHigh
    secondaryStackViewHeightConstraint.isActive = true
    
    secondaryStackView.addArrangedSubview(imageContainerView)
    imageContainerWidthConstraint = imageContainerView.widthAnchor.constraint(equalToConstant: 90)
    imageContainerWidthConstraint.priority = .defaultHigh
    imageContainerWidthConstraint.isActive = true
    imageContainerView.addSubview(shadowLayer)
    shadowLayer.widthAnchor.constraint(equalToConstant: 80).isActive = true
    shadowLayer.heightAnchor.constraint(equalToConstant: 80).isActive = true
    shadowLayer.topAnchor.constraint(equalTo: imageContainerView.topAnchor).isActive = true
    shadowLayer.trailingAnchor.constraint(equalTo: imageContainerView.trailingAnchor, constant: -10).isActive = true
    imageContainerView.addSubview(wishImage)
    wishImage.widthAnchor.constraint(equalToConstant: 80).isActive = true
    wishImage.heightAnchor.constraint(equalToConstant: 80).isActive = true
    wishImage.topAnchor.constraint(equalTo: imageContainerView.topAnchor).isActive = true
    wishImage.trailingAnchor.constraint(equalTo: imageContainerView.trailingAnchor, constant: -10).isActive = true
    
    secondaryStackView.addArrangedSubview(thirdHelperView)
    thirdHelperView.addSubview(thirdStackView)
    thirdHelperViewHeightConstraint = thirdHelperView.heightAnchor.constraint(equalToConstant: 90)
    thirdHelperViewHeightConstraint.priority = .defaultHigh
    thirdHelperViewHeightConstraint.isActive = true
    
    thirdStackView.addArrangedSubview(priceView)
    priceView.heightAnchor.constraint(equalToConstant: 30).isActive = true
    priceView.addSubview(priceImage)
    priceView.addSubview(priceLabel)
    
    thirdStackView.addArrangedSubview(linkView)
    linkView.heightAnchor.constraint(equalToConstant: 30).isActive = true
    linkView.addSubview(linkImage)
    linkView.addSubview(linkTextView)
    
    thirdStackView.addArrangedSubview(noteView)
    noteView.heightAnchor.constraint(equalToConstant: 30).isActive = true
    noteView.addSubview(noteImage)
    noteView.addSubview(noteLabel)

    priceImage.topAnchor.constraint(equalTo: priceView.topAnchor).isActive = true
    priceImage.leadingAnchor.constraint(equalTo: thirdStackView.leadingAnchor).isActive = true
    priceImage.heightAnchor.constraint(equalToConstant: 20).isActive = true
    priceImage.widthAnchor.constraint(equalToConstant: 20).isActive = true
    
    priceLabel.topAnchor.constraint(equalTo: priceView.topAnchor).isActive = true
    priceLabel.leadingAnchor.constraint(equalTo: priceImage.trailingAnchor, constant: 10).isActive = true
    priceLabel.trailingAnchor.constraint(equalTo: priceView.trailingAnchor, constant: -10).isActive = true
    
    linkImage.topAnchor.constraint(equalTo: linkView.topAnchor).isActive = true
    linkImage.leadingAnchor.constraint(equalTo: thirdStackView.leadingAnchor).isActive = true
    linkImage.heightAnchor.constraint(equalToConstant: 20).isActive = true
    linkImage.widthAnchor.constraint(equalToConstant: 20).isActive = true

    linkTextView.topAnchor.constraint(equalTo: linkView.topAnchor).isActive = true
    linkTextView.leadingAnchor.constraint(equalTo: linkImage.trailingAnchor, constant: 10).isActive = true
    linkTextView.trailingAnchor.constraint(equalTo: linkView.trailingAnchor, constant: -10).isActive = true
    
    noteImage.topAnchor.constraint(equalTo: noteView.topAnchor).isActive = true
    noteImage.leadingAnchor.constraint(equalTo: thirdStackView.leadingAnchor).isActive = true
    noteImage.heightAnchor.constraint(equalToConstant: 20).isActive = true
    noteImage.widthAnchor.constraint(equalToConstant: 20).isActive = true

    noteLabel.topAnchor.constraint(equalTo: noteView.topAnchor).isActive = true
    noteLabel.leadingAnchor.constraint(equalTo: noteImage.trailingAnchor, constant: 10).isActive = true
    noteLabel.trailingAnchor.constraint(equalTo: noteView.trailingAnchor, constant: -10).isActive = true
}

更重要的是:cellForRowAt,我实际上根据内容隐藏/显示不同的视图。如您所见,如果内容为空(在第一个单元格中),我实际上在 ImageContainerView, priceView, linkView & noteView 上调用 .isHidden

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    let cell = tableView.dequeueReusableCell(withIdentifier: WhishCell.reuseID, for: indexPath) as! WhishCell
    
    cell.label.text = ""
    cell.linkTextView.text = ""
    cell.priceLabel.text = ""
    cell.noteLabel.text = ""
    cell.wishImage.image = UIImage()
    
    let currentWish = self.wishData[indexPath.row]
    
    cell.label.text = currentWish.name
    cell.linkTextView.hyperLink(originalText: "Link öffnen", hyperLink: "Link öffnen", urlString: currentWish.link)
    cell.priceLabel.text = currentWish.price
    cell.noteLabel.text = currentWish.note
    cell.wishImage.image = currentWish.image
    
    cell.setupSuccessAnimation()
    
    cell.noteView.isHidden = false
    cell.priceView.isHidden = false
    cell.linkView.isHidden = false
    cell.imageContainerView.isHidden = false
    cell.secondaryStackViewHeightConstraint.constant = 0
    cell.thirdHelperViewHeightConstraint.constant = 0
    
    if currentWish.image == nil || !currentWish.image!.hasContent {
        cell.imageContainerView.isHidden = true
        print("but its truue:  \(cell.imageContainerView.isHidden)")
        if currentWish.price != "" {
            cell.thirdHelperViewHeightConstraint.constant += 30
            cell.secondaryStackViewHeightConstraint.constant += 30
        }
        if currentWish.link != "" {
            cell.thirdHelperViewHeightConstraint.constant += 30
            cell.secondaryStackViewHeightConstraint.constant += 30
        }
        if currentWish.note != "" {
            cell.thirdHelperViewHeightConstraint.constant += 30
            cell.secondaryStackViewHeightConstraint.constant += 30
        }
    } else {
        cell.secondaryStackViewHeightConstraint.constant = 90
        cell.thirdHelperViewHeightConstraint.constant = 90
    }
    
    if currentWish.price == "" {
        cell.priceView.isHidden = true
    }
    
    if currentWish.link == "" {
        cell.linkView.isHidden = true
    }
    
    if currentWish.note == "" {
        cell.noteView.isHidden = true
    }
    
    return cell
}

我不知道为什么会这样。我认为设置没有问题,因为如果我实际添加cells,它就可以工作。它根本不隐藏实际应该隐藏的视图。 cellheight 也按预期工作。只是该死的隐藏......

我知道这很多,但我希望我的问题很清楚。如果您需要更多信息,请告诉我!

更新: 我在cellForRowAt 中添加了两个print-statements,实际上是在打印:

    print("but its truue:  \(cell.imageContainerView.isHidden)")
    print("but its truue:  \(cell.shadowLayer.isHidden)")

但它是真的:真的

但它是真的:假

所以它正确地隐藏了imageConatinerView,但不是shadowLayer,即使shadowLayersubViewimageContainerView??!我卡在这里...

【问题讨论】:

  • 哪个方法调用单元格上的 setupViews?顺便说一句,xib 确实可以简化这一点。
  • @Sulthan 从未与 xib 合作过,更喜欢这样的 tbh。 setupViews 在 cells init 中调用

标签: ios swift uitableview uiview


【解决方案1】:

您可以使用 UIView 调试方法来调试您的 UI。 有四种有用的调试方法:

  • hasAmbiguousLayout:
  • exerciseAmbiguityInLayout:
  • exerciseAmbiguityInLayout:
  • _autolayoutTrace:

然后你可以使用 Xcode UI Debug 来检查你的 UI

【讨论】:

  • 我查看了 View Hirarchy,它在那里看起来非常好,但在实际设备上却没有。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 2013-02-17
  • 2015-04-03
相关资源
最近更新 更多