Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当我使弱ibnslayoutConstraint处于非活动状态时,为什么它变为零?_Ios_Objective C_Uikit_Iboutlet_Ios Autolayout - Fatal编程技术网

Ios 当我使弱ibnslayoutConstraint处于非活动状态时,为什么它变为零?

Ios 当我使弱ibnslayoutConstraint处于非活动状态时,为什么它变为零?,ios,objective-c,uikit,iboutlet,ios-autolayout,Ios,Objective C,Uikit,Iboutlet,Ios Autolayout,我的应用程序中有一个ibnslayoutConstraint。非常简单: @property (nonatomic, weak) IBOutlet NSLayoutConstraint* leftConstraint; 在某个时候,我想停用此约束: self.leftConstraint.active = NO; self.myConstraint = self.myViewThatHasTheConstraint.heightAnchor.constraint(equalToConstan

我的应用程序中有一个
ibnslayoutConstraint
。非常简单:

@property (nonatomic, weak) IBOutlet NSLayoutConstraint* leftConstraint;
在某个时候,我想停用此约束:

self.leftConstraint.active = NO;
self.myConstraint = self.myViewThatHasTheConstraint.heightAnchor.constraint(equalToConstant: self.myConstraint_DefualtValue);
self.myConstraint?.isActive = true

它发生在从
cellforrowatinexpath:
调用的方法中。在上面的一行之后,约束变为零。但是,如果我将这个属性声明为
strong
,那么它就可以了,它不会变成nil。有人能解释为什么会发生这种情况吗?

当您的插座是
弱的
时,唯一的
强的
引用来自视图的
约束
属性。停用约束会将其从该数组中移除,因此不再有强引用。

一种可能的解决方法是更改约束优先级,而不是将其停用:

@property (nonatomic, weak) IBOutlet NSLayoutConstraint* leftConstraint;
(...)
self.leftConstraint.priority = 250;
然后,不处理self.leftConstraint

编辑:


Xcode不支持更改所需(=1000)约束的优先级,因此请确保在1到999之间切换

首先将IBOutlet变量更改为可选变量。即:

发件人:

@IBOutlet weak var myConstraint : NSLayoutConstraint!
致:

现在,为了便于将来管理/更改故事板,请添加一个新变量(例如myConstraint\u defaultValue),并将其设置为viewDidLoad中的myConstraint

var myConstraint_DefualtValue = CGFloat(0)
override func viewDidLoad() {
    super.viewDidLoad()

    self.myConstraint_DefualtValue = self.myConstraint.constant

}
我认为很明显,为什么需要在viewDidLoad中设置它,而不是在其他地方

然后,当您要停用它时:

self.myConstraint?.isActive = false
当您想要重新激活它时(假设您将视图作为一个出口(MyViewhasConstraint),并且约束是一个高度约束):


非常感谢!我也得出了同样的结论,但让它变得强大安全吗?我的约束是在集合视图单元格中,我担心当单元格被回收时,保持强引用将创建一个保留周期。@Echelon,如果不了解更多的类关系,就无法回答这个问题。但是,只要有一个明确的断点,循环就可以了。一个解决方案是更改约束的
常量值。@Echelon我相信,是的,创建
NSAutolayoutConstraint
strong
是安全的。我的理解是,
NSAutolayoutConstraint
本身对其约束的元素有
弱的
引用,因此不可能出现循环。不过,我很高兴在这个问题上得到纠正!这似乎是一个可以通过相当简单的单元测试来解决的问题。创建两个视图。对它们创建一个强大的约束。释放视图上的强引用。检查视图上的弱引用是否仍然到达它们。如果是,则约束将约束它们,否则,约束不会约束它们。
self.myConstraint = self.myViewThatHasTheConstraint.heightAnchor.constraint(equalToConstant: self.myConstraint_DefualtValue);
self.myConstraint?.isActive = true