为什么弱IBOutlet NSLayoutConstraint在我使其无效时变为nil?

时间:2016-06-27 10:42:08

标签: ios objective-c uikit iboutlet ios-autolayout

我的应用中有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:,那么没关系,它就不会变为零。任何人都能解释为什么会这样吗?

3 个答案:

答案 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