Swift视图未正确隐藏子视图

如何解决Swift视图未正确隐藏子视图

在底部更新

在我的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(阴影)和content

代码:

我的代码非常复杂且混乱,因此您可以在这里关注我:

CustomCell中的setupViews:

我认为这不是很有帮助,但是我也不认为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的{​​{1}},它也正确地隐藏了shadowLayer而不是subView?我被困在这里...

解决方法

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

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

然后您可以使用Xcode UI调试来查看您的UI

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-