在viewWillAppear中使用UserDefaults

时间:2019-04-27 20:28:16

标签: swift

我正在设置设置页面(在SettingsView类中),用户可以在其中为背景视差效果设置“开” /“关”。所选内容保存在UserDefaults().string(forKey: "parallaxStatus")中。在ViewController类的viewWillAppear中,我检查了parallaxStatus。如果视差效果的状态为“开”,则显示该效果。如果状态为“关”,则什么也不会发生。

parallaxStatus从«On»变为«Off»时出现问题。在这种情况下,在重新加载View之前,视差效果仍然显示。但是,如果parallaxStatus从«Off»更改为«On»,则该函数将在不重新加载View的情况下正常运行。

下面是viewWillAppear函数的代码。感谢您的帮助或提示。

    override func viewWillAppear(_ animated: Bool) {

    let parallaxStatus = UserDefaults().string(forKey: "parallaxStatus")

    if parallaxStatus == "On" {

        let min = CGFloat(-40)
        let max = CGFloat(40)

        let xMotion = UIInterpolatingMotionEffect(keyPath: "layer.transform.translation.x", type: .tiltAlongHorizontalAxis)
        xMotion.minimumRelativeValue = min
        xMotion.maximumRelativeValue = max

        let yMotion = UIInterpolatingMotionEffect(keyPath: "layer.transform.translation.y", type: .tiltAlongVerticalAxis)
        yMotion.minimumRelativeValue = min
        yMotion.maximumRelativeValue = max

        let motionEffectGroup = UIMotionEffectGroup()
        motionEffectGroup.motionEffects = [xMotion,yMotion]

        bgImage.addMotionEffect(motionEffectGroup) } else { }

}

1 个答案:

答案 0 :(得分:1)

1-您应该在userDefaults中使用bool值

constexpr int i = 10;
constexpr int j = 5;
std::string str{ i * j, 'f' }; // ok as long as the values are constexpr and don't cause any narrowing conversion this value: 10 * 5 = 50 which is a well defined signed-char value.

int i = 10;
int j = 5;
std::string str{ i * j, 'f' }; // error. the values of i and j are not constant thus it may overflow a signed char causing narrowing conversion thus the compiler is wise enough to prevent this initialization.

2-{{​​1}}在您拒绝显示/弹出的vc时被调用,因此在您的情况下,您可以使用settingsView而不是vc来验证它是否被其他KVO或任何事件驱动的通知程序调用

3-如果状态为on并更改为off,请验证是否删除了vc仍然存在的运动效果(不要取消分配,请在其他检查中进行操作)

UserDefaults.standard.bool(forKey: "parallaxStatusOn") // default is false