Swift - bool 的值被改变而不做任何事情?找不到修改的地方?

Posted

技术标签:

【中文标题】Swift - bool 的值被改变而不做任何事情?找不到修改的地方?【英文标题】:Swift - value of bool being changed without doing anything? Cant find where its being altered? 【发布时间】:2016-07-18 02:43:45 【问题描述】:

我向上帝发誓,我这里有一个流氓变量——我有一个布尔值menuUp,它简单地告诉我们某些菜单按钮是否被上移了。

我首先将 bool 声明为 false,然后根据 bool(菜单是否打开),动画将在滑动手势/功能上运行。

var menuUp = Bool(false) //at class level

我已经设置了许多断点和打印语句,但似乎 bool 正在被修改而我没有做任何事情。当应用程序加载时,我的超级视图控制器调用此函数,打印以下内容并使 menuup 为真。

func moveMenuUp(sender: AnyObject!)
    
        print("menu up:")
        print(menuUp)

        if !menuUp && !externalViewUp
        
            UIView.animateWithDuration(0.8, delay: 0.0, usingSpringWithDamping:
                0.65, initialSpringVelocity: 1.2, options: [], animations: 

                    //above change the duration to the time it will take,
                    //and fiddle with the springs between 0-1 until you are happy with the effect.
                    self.menuBtn1.center.y -= screenSize.height * (122/568)
                    self.menuBtn2.center.y -= screenSize.height * (122/568)
                    self.menuBtn3.center.y -= screenSize.height * (122/568)
                    //chnage frame however you want to here

                , completion:  finished in
                    //code that runs after the transition is complete here

            )
            menuUp = !menuUp
        

        print(menuUp)

    

所以这是真的。伟大的。然后在另一个类中,我像这样引用这个超级 viecontorller,并在按钮上尝试调用菜单向下功能,也可以通过在超级视图控制器上向下滑动来调用该功能 -

let superv : StarterViewController = StarterViewController (nibName: "StarterViewController", bundle: nil)

然后

func showIdeaView()
    
        networkTimer.invalidate()

         superv.moveMenuDown(self) //THIS NEEDS WORK!! BOOL ISSUES!

        externalViewUp = true

        viewGestureRecognizer.enabled = false
        self.addChildViewController(v)
        self.view.addSubview(v.view)
        v.didMoveToParentViewController(self)

        v.view.frame = self.view.bounds
        self.view.bringSubviewToFront(v.view)

    

哪个调用

func moveMenuDown(sender: AnyObject!)
    
        print("moving down!!!")
        print(menuUp)

        if menuUp == true 
            UIView.animateWithDuration(0.8, delay: 0.0, usingSpringWithDamping:
                0.65, initialSpringVelocity: 1.2, options: [], animations: 

                    //above change the duration to the time it will take,
                    //and fiddle with the springs between 0-1 until you are happy with the effect.
                    self.menuBtn1.center.y += screenSize.height * (122/568)
                    self.menuBtn2.center.y += screenSize.height * (122/568)
                    self.menuBtn3.center.y += screenSize.height * (122/568)
                    //chnage frame however you want to here

                , completion:  finished in
                    //code that runs after the transition is complete here

            )
        menuUp = !menuUp
            

        print(menuUp)

    

并且这个函数被调用,但是它打印 - 在调用上述函数的函数的开头,我打印了布尔值,这里也是假的。

奇怪的是,当我通过滑动触发moveMenuDown 时,它会正确输出(开始为真,结束为假)。

菜单仍然清晰可见,我可以看到它,所以我知道 bool 不应该/不是假的。

因为它读取 ht bool 为 false,所以它不会调用动画并在moveMenuDown 中向下移动菜单。这是个大问题。

我可以在这里做什么?我试过点击放大镜来找到我引用布尔的所有地方,但我不会在超级视图控制器之外的任何地方更改它,我只在这两个函数中更改了两次。

怎么了?

编辑:

我现在在超级视图控制器的类中有weak var superv: StarterViewController!,我已经在另一个子视图控制器中编写了:

 let s  = StarterViewController()

在viewdidLoad中:

s.superv = self 

但收到错误

【问题讨论】:

当您初始化StarterViewController 时,您确定没有初始化menuUp 的第二个实例吗? 可以添加断点,在其值发生变化时中断 @SausageDioxide 我该怎么做?我不精通断点 menuUp 上实现didSet 属性观察器,并在其中设置断点。看看你是否能发现意想不到的变化。 这可能..如果我在 parentviewcontroller 上调用 moveMenuDown 而不是 superv 我设置它的方式我仍然会这样做还是..正确的方法是什么 【参考方案1】:

在这一行

let superv : StarterViewController = 
    StarterViewController (nibName: "StarterViewController", bundle: nil)

您实际上是在创建StarterViewController 实例!每当创建 StarterViewController 时,它的实例属性就会被初始化。其中之一是menuUp,它被初始化为false

你看到了吗?您创建的superv 不是之前将menuUp 设置为true 的控制器。这是StarterViewController 的完全不同且独立的实例。

要解决此问题,您需要在创建您所说的“另一个类”之后将self 分配给superv

let theOtherClass = TheOtherClass(...)
theOtherClass.superv = self

另外,您应该将superv 的声明更改为:

weak var superv: StarterViewController!

【讨论】:

谢谢。开始明白。您在哪里以及在哪些类中声明这些? 请查看我的问题,了解我的所作所为 - 需要帮助 这很容易。只需将您当前的 superv 声明更改为上述声明即可。你如何创建你提到的另一个类?在你创建另一个类并将其放入一个名为theOtherClass pr 的变量之后,写theOtherClass.superv = self@skyguy【参考方案2】:

添加如下所示的属性观察器

var menuUp = Bool(false)   //at class level
    didSet 
        print("")
    

print("") 行中添加一个调试点,看看谁在更改它。

【讨论】:

以上是关于Swift - bool 的值被改变而不做任何事情?找不到修改的地方?的主要内容,如果未能解决你的问题,请参考以下文章

Swift UIGestureRecognizer 不工作/不做任何事情

下拉框更改时提交表单 - 不做任何事情

ListView onItemClickListener 不做任何事情

OpenCV destroyWindow() 不做任何事情。

WebSocketSession.send 不做任何事情

TabControl.VerticalAlignment = 拉伸不做任何事情