首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在IBOutlets中切换选项卡时,视图控制器与UITabView中的约束失去连接

在IBOutlets中切换选项卡时,视图控制器与UITabView中的约束失去连接
EN

Stack Overflow用户
提问于 2020-11-04 19:36:46
回答 1查看 77关注 0票数 1

好的,下面是我的代码的相关部分:

代码语言:javascript
复制
class MyViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var questionView: QuestionView!
    @IBOutlet weak var answerView: AnswerView!
    
    @IBOutlet weak var tableView: UITableView!
    
    @IBOutlet weak var tableViewTopConstraint: NSLayoutConstraint! // Active at start, attaches tableView.topAnchor to questionView.bottomAnchor
    @IBOutlet weak var tableViewTopAlternateConstraint: NSLayoutConstraint! // Inactive at start, attaches tableView.topAnchor to answerView.bottomAnchor
    
    func submitAnswer() {
        tableViewTopConstraint.isActive = false
        tableViewTopAlternateConstraint = true
    }
    
    func newQuestion() {
        tableViewTopConstraint.isActive = true
        tableViewTopAlternateConstraint = false
    }
}

我正在构建一个问答型的应用程序,由于设计原因,这两个子视图的大小不同。我设置了它,以便根据当前的状态在两个子视图之间切换(当用户点击前进时切换回一个新的问题),它工作得很好.

...until我转到UITabView上的另一个选项卡,它包含所有内容(例如,更改设置,然后继续测试)。

一旦选项卡改变,就好像NSLayoutConstraint插座已经不存在了。更改它们的命令仍然在处理(我已经在控制台中验证了这一点),但是他们什么也不做。

  • 我试着声明这些出口是强大的(行为没有区别)--
  • --我删除了这些出口,并在代码中对它们进行了管理(这是第一次工作了,但后来,它将较短的QuestionView_的高度拉长,以匹配tableView_的新的顶部位置,而不是将tableView移动到QuestionView的底部,就像QuestionView尝试实现UITabViewController一样,这样,每当我切换回该选项卡时,就可以调用tabBar(_:didSelect:)并用全新的MyViewController()实例替换视图控制器(它第一次加载,但是当我尝试切换制表符时,它会在访问任何一个nil __s...even时找到它,尽管我没有点击测试视图的选项卡,并且在替换现有的视图控制器时由item.tag过滤)

关于如何解决这个问题,有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-04 20:24:02

首先,不要将@IBOutlet属性设置为weak。我知道这是默认的,但这是不对的。

如果你有这个:

代码语言:javascript
复制
@IBOutlet weak var tableViewTopAlternateConstraint: NSLayoutConstraint!

通过Storyboard连接到约束,然后执行以下操作:

代码语言:javascript
复制
tableViewTopAlternateConstraint.isActive = false

您只需将从存在的中删除。

此外,如果您在Storyboard中有两个不同的顶部约束,您应该得到一个错误指示符,因为它们不能满足。

最好要么更改优先级,要么使用单个约束并更改.constant值。

因此,在Storyboard中有两个限制:

将“默认”约束设置为Priority: High (750)

  • set,“”约束设置为PriorityL Low (250)

你的代码变成:

代码语言:javascript
复制
func submitAnswer() {
    tableViewTopConstraint.priority = .defaultLow
    tableViewTopAlternateConstraint.priority = .defaultHigh
}

func newQuestion() {
    tableViewTopAlternateConstraint.priority = .defaultLow
    tableViewTopConstraint.priority = .defaultHigh
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64686624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档