繁体   English   中英

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

[英]Can't change UIView.isHidden property after action is called by UIBarButton

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

这是更改视图属性的方法:

@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调用的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

正如你在上面看到的,普通动作视图的isHidden属性没有改变,即使它被设置为“false”。 我最初认为这是因为引用在某处丢失(尽管我认为这会导致引用为零,而我没有),所以我对normalActionViewkeyboardActionView的引用做了强引用。 显然,这并没有解决问题,所以我把对isHidden的更改放在通知调用的方法中,以确保它始终在同一个线程上(确实如此,我通过打印当前线程进行了检查,它始终是主线程) ,但这也无济于事。

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

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

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

为什么将 uiview 动画绑定到键盘通知? 这是您的应用程序 UI 的必需部分吗? 我认为您可以在按下按钮后为您的视图设置动画。 因为在任何视图中都很难捕捉到准确的键盘动画速度。 我的意思是当通知中心尝试捕捉和动画视图时,键盘会快速关闭。

谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM