我的应用中有Traceback:
at Bugzilla/Mailer.pm line 179.
Bugzilla::Mailer::MessageToMTA(...) called at Bugzilla/Token.pm line 89
Bugzilla::Token::issue_new_user_account_token(...) called at Bugzilla/User.pm line 2423
Bugzilla::User::check_and_send_account_creation_confirmation(...) called at C:/bugzilla/createaccount.cgi line 39
。很简单:
IBOutlet NSLayoutConstraint
在某些时候,我想停用此约束:
@property (nonatomic, weak) IBOutlet NSLayoutConstraint* leftConstraint;
它发生在从self.leftConstraint.active = NO;
调用的方法中。并且约束在上面的行之后变为零。但是,如果我将此属性声明为cellForRowAtIndexPath:
,那么没关系,它就不会变为零。任何人都能解释为什么会这样吗?
答案 0 :(得分:56)
当你的插座为weak
时,唯一的strong
参考来自视图的constraints
属性。取消激活约束会将其从该数组中删除,因此不再有强引用。
答案 1 :(得分:7)
可能的解决方法是更改约束优先级而不是使其处于非活动状态:
@property (nonatomic, weak) IBOutlet NSLayoutConstraint* leftConstraint;
(...)
self.leftConstraint.priority = 250;
然后,不会处理self.leftConstraint。
编辑:
Xcode不支持更改所需(= 1000)约束的优先级,因此请务必切换1 ... 999之间的范围。
答案 2 :(得分:2)
首先将IBOutlet变量更改为可选变量。即:
来自:
@IBOutlet weak var myConstraint : NSLayoutConstraint!
收件人:
@IBOutlet weak var myConstraint : NSLayoutConstraint?
现在,要使将来在情节提要中更易于管理/更改,请添加新变量(例如 myConstraint_DefualtValue )并将其设置为 myConstraint 在 viewDidLoad
中var myConstraint_DefualtValue = CGFloat(0)
override func viewDidLoad() {
super.viewDidLoad()
self.myConstraint_DefualtValue = self.myConstraint.constant
}
我想很明显,为什么您需要在 viewDidLoad 中而不是其他地方设置它
然后,当您要停用它时:
self.myConstraint?.isActive = false
并且当您想要重新激活它时(假设您将视图作为出口( myViewThatHasTheConstraint ),并且约束是高度约束):
self.myConstraint = self.myViewThatHasTheConstraint.heightAnchor.constraint(equalToConstant: self.myConstraint_DefualtValue);
self.myConstraint?.isActive = true