好的,下面是我的代码的相关部分:
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过滤)关于如何解决这个问题,有什么建议吗?
发布于 2020-11-04 20:24:02
首先,不要将@IBOutlet属性设置为weak。我知道这是默认的,但这是不对的。
如果你有这个:
@IBOutlet weak var tableViewTopAlternateConstraint: NSLayoutConstraint!通过Storyboard连接到约束,然后执行以下操作:
tableViewTopAlternateConstraint.isActive = false您只需将从存在的中删除。
此外,如果您在Storyboard中有两个不同的顶部约束,您应该得到一个错误指示符,因为它们不能满足。
最好要么更改优先级,要么使用单个约束并更改.constant值。
因此,在Storyboard中有两个限制:
将“默认”约束设置为Priority: High (750)
PriorityL Low (250)你的代码变成:
func submitAnswer() {
tableViewTopConstraint.priority = .defaultLow
tableViewTopAlternateConstraint.priority = .defaultHigh
}
func newQuestion() {
tableViewTopAlternateConstraint.priority = .defaultLow
tableViewTopConstraint.priority = .defaultHigh
}https://stackoverflow.com/questions/64686624
复制相似问题