首页 > 解决方案 > Swift View 没有正确隐藏子视图

问题描述

底部更新

在我的里面我ViewController有一个TableViewwith CustomCells。其中呈现的内容cells取决于userInput. 我认为解释问题的最好方法是实际展示它:

1.添加cellstableView

看起来像预期的那样

2.问题:关闭ViewController并返回后:

显示实际上应该隐藏在第一个视图中的视图cell

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

video为了更好地理解,这里还有另一个: video 在这种情况下,我没有添加image,但是当返回到时,viewController它仍然显示imageContainerView(阴影)以及content第一个单元格的 。

代码:

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

setupViews 中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,我实际上根据内容隐藏/显示不同的视图。如您所见,如果内容为空(位于第一个单元格中),.isHidden我实际上会调用ImageContainerView, priceView, linkView & noteView

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也按预期工作。只是该死的隐藏...

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

更新:print-statements在里面加了两个cellForRowAt,实际上是在打印这个:

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

但它的真实性:真实

但它是真的:假

所以它是正确隐藏的,imageConatinerViewshadowLayer即使shadowLayer是??! 我卡在这里...subViewimageContainerView

标签: iosswiftuitableviewuiview

解决方案


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

  • hasAmbiguousLayout:
  • 练习AmbiguityInLayout:</li>
  • 练习AmbiguityInLayout:</li>
  • _autolayoutTrace:

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


推荐阅读