gpt4 book ai didi

ios - UIBarButton 调用操作后无法更改 UIView.isHidden 属性

转载 作者:行者123 更新时间:2023-11-28 05:40:46 37 4
gpt4 key购买 nike

我正在使用 UIViewisHidden 属性来显示/隐藏我正在开发的发布界面上的控件。我用它来更改键盘向上/向下、选择帖子类型等时可用的控件。我编写了一个由设置 View 属性(主要是 .isHidden)和动画的通知触发的方法更改,当键盘出现时调用,或者当用户选择一个帖子类型,然后更改他们可用的控件时。这通常工作得很好,并且属性会按预期更改,但是当该方法由 UIBarButton 操作触发时,设置为可见的 View 变得无响应。点击栏按钮后,我无法更改 View 的 isHidden 属性(即使将 isHidden 显式设置为 true 或 false...它也不会改变)。

下面是改变 View 属性的方法:

@objc func animateActionViewChange(_ sender: Notification) {
// DEBUG
print("\n[BEFORE]\nnormalActionView.isHidden: \(normalActionView.isHidden)\nkeyboardActionView.isHidden: \(keyboardActionView.isHidden)\nkeyboardUp: \(keyboardUp)\nactionViewActive: \(actionViewActive)")

// save prev state
let normalTemp: Bool = normalActionView.isHidden
let keyboardTemp: Bool = keyboardActionView.isHidden

// set new state based on env vars
normalActionView.isHidden = keyboardUp ? true : !actionViewActive
keyboardActionView.isHidden = keyboardUp ? !actionViewActive : true

// DEBUG
print("[AFTER]\nnormalActionView.isHidden: \(normalActionView.isHidden)\nkeyboardActionView.isHidden: \(keyboardActionView.isHidden)\nkeyboardUp: \(keyboardUp)\nactionViewActive: \(actionViewActive)")

// animate opacity changes
if normalActionView.isHidden != normalTemp {
let targetAlpha: CGFloat = normalTemp ? CGFloat(1) : CGFloat(0)

UIView.animate(withDuration: actionViewAnimationDuration / 2) {
self.normalActionView.alpha = targetAlpha
}
}

if keyboardActionView.isHidden != keyboardTemp {
let targetAlpha: CGFloat = keyboardTemp ? CGFloat(1) : CGFloat(0)

UIView.animate(withDuration: actionViewAnimationDuration / 2) {
self.keyboardActionView.alpha = targetAlpha
}
}
}

以及 UIBarButton 调用的操作(此问题涉及按钮标题为“返回”时):

// back/cancel button action
@IBAction func cancel(sender: UIBarButtonItem) {
if sender.title == "Cancel" {
// cancel ongoing request if there is one
if let request = ongoingRequest {
if !request.isFinished {
request.cancel()
}
}

self.performSegue(withIdentifier: "cancel_unwindFromNewPostView", sender: self)
} else {
// reset post type to default (general)
postType = .general

// set actionViewActive bool to set visibility going forwards
actionViewActive = true

// hide datePicker
self.datePickerView.isHidden = true

actionViewAnimationDuration = 0.35
NotificationCenter.default.post(name: NSNotification.Name("animateActionViewChange"), object: nil)

UIView.animate(withDuration: 0.35) {
// layout
self.view.layoutIfNeeded()
}

// revert button text to 'cancel'
cancelButton.title = "Cancel"
}
}

这是点击“后退”按钮之前调试标志的输出:

[BEFORE]
normalActionView.isHidden: false
keyboardActionView.isHidden: true
keyboardUp: true
actionViewActive: true
[AFTER]
normalActionView.isHidden: true
keyboardActionView.isHidden: false
keyboardUp: true
actionViewActive: true

之后:

[BEFORE]
normalActionView.isHidden: true
keyboardActionView.isHidden: true
keyboardUp: false
actionViewActive: true
[AFTER]
normalActionView.isHidden: true
keyboardActionView.isHidden: true
keyboardUp: false
actionViewActive: true

正如您在上面看到的,普通操作 View 的 isHidden 属性没有改变,即使它被设置为“false”。我最初认为这是因为引用在某处丢失了(虽然我认为这会导致 nil 引用,但我没有),所以我引用了 normalActionView keyboardActionView 强大。显然,这并没有解决问题,所以我将对 isHidden 的更改放在一个通知调用的方法中,以确保它始终在同一个线程上(确实如此,我通过打印当前线程来检查thread,它总是 main),但这也没有帮助。

最佳答案

isHidden 表现得好像是累积的。例如,如果连续两次将其设置为 true,则需要将其设置为 false 两次。

我通常在设置值之前检查相反的值。

if view.isHidden == false {
view.isHidden = true
}

关于ios - UIBarButton 调用操作后无法更改 UIView.isHidden 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56830523/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com